2017-02-13 57 views
0

我想學習posix並想從somethig開始簡單。我想處理不同線程上的數組元素。我的代碼是:posix pthread在單獨線程中的數組元素上工作

#include <iostream> 
#include <pthread.h> 
using namespace std; 

static void* doWork(int* a, size_t s) { 
    for(int i = 0; i < s; i++) { 
     a[i] = a[i] * 2; 
    } 
    //return void; 
} 

void printIntArr(int* a, size_t s) { 
    for(int i = 0; i < s; i++) { 
     cout << a[i] << " "; 
    } 
    cout << endl; 
} 

int main() { 

    int a[24]; 
    for(int i = 0; i < 24; i++) { 
     a[i] = i; 
    } 

    printIntArr(&a[0], 24); //before 

    //I want to make 2 threads, and pass first half and second half of the array to process 
    pthread_t tA, tB; 
    int resultA = pthread_create(&tA, NULL, &doWork(&a[0],12), NULL); 
    int resultB = pthread_create(&tB, NULL, &doWork(&a[11],12), NULL); 

    printIntArr(&a[0], 24); //after 

    return 0; 
} 

我只是想對不同的線程陣列的上半年和下半年進行doWork功能。是的,我的代碼不能編譯。

+0

可能想'pthread_join'這些線程啓動它們後你懶得枚舉和打印非常的事情,他們是前修改。獲取有關pthreads的好書。這很值得。如果您使用的是相當新的C++(11或更高版本),請使用[''](http://en.cppreference.com/w/cpp/thread)。在現代C++線程世界裏,真正的晚餐是什麼。 – WhozCraig

回答

0
#include <iostream> 
#include <pthread.h> 
using namespace std; 

typedef struct { 
    int* a; 
    size_t s; 
} Params; 

static void* doWork(void * data) { 
    Params * p = (Params *) data; 
    for(int i = 0; i < p -> s; i++) { 
     p ->a[i] = p ->a[i] * 2; 
    } 
    //return void; 
    return data; 
} 

void printIntArr(int* a, size_t s) { 
    for(int i = 0; i < s; i++) { 
     cout << a[i] << " "; 
    } 
    cout << endl; 
} 

int main() { 

    int a[24]; 
    for(int i = 0; i < 24; i++) { 
     a[i] = i; 
    } 

    printIntArr(&a[0], 24); //before 

    Params p1; 
    p1.a = &(a[0]); 
    p1.s = 12; 

    Params p2; 
    p2.a = &(a[11]); 
    p2.s = 12; 


    //I want to make 2 threads, and pass first half and second half of the array to process 
    pthread_t tA, tB; 
    int resultA = pthread_create(&tA, NULL, doWork, (void *)&p1); 
    int resultB = pthread_create(&tB, NULL, doWork, (void *)&p2); 

    pthread_join(tA, NULL); 
    pthread_join(tA, NULL); 

    printIntArr(&a[0], 24); //after 

    return 0; 
} 

如果您編碼在C++中,你可以使用這一個:http://cpp.sh/4du5

0

你看過pthreads documentation嗎?在並行線程的線程函數必須是這樣的:

void * dowork(void * arg); 

時,傳遞函數的API pthread_create的,也是一個指針傳遞給你想讓它什麼處理。在你的情況,你想創建一個struct的數據保持到過程,是這樣的:

struct param { 
     int anarray[10]; 
     int size; 
    } 

你會然後實例莫名其妙的結構:

param p = { ... }; 

,並調用並行線程創建:

pthread_create(&thread, NULL, dowork, & p); 

您的dowork函數將由具有結構實例地址的線程調用,您將需要解壓並以某種方式使用它。

所有這些將是太多如果您只是使用C++標準庫中的std :: thread類,則更簡單。

相關問題