我在理解多线程方面遇到了一些困难。情况如下:
我将从数组中选择一些整数,并将它们存储到具有某些条件的另一个数组中。条件非常复杂,基本上它是array [i]和所有其他数组[not i]之间的一组巨大比较。我们称之为checkCondition();
首先,我创建了pthread。这是我的代码,注意到dataPackage是一个包含数组的结构。
for(int i = 0; i < thread_number; i++){
if(pthread_create(&tid, NULL, checkPermissible, &dataPackage) != 0){
perror("Error occurs when creating thread!!!\n");
exit(EXIT_FAILURE);
}
}
for(int i = 0; i < thread_number; i++){
pthread_join(tid, NULL);
}
以下是checkPermissible()
的内容void* checkPermissible(void* content){
readThread *dataPackage = content;
for(int i = 0; i < (*dataPackage).arrayLength; i++){
if(checkCondition()){
pthread_mutex_lock(&mutex);
insert(array[i], (*dataPackage).result);
pthread_mutex_unlock(&mutex);
//if condition true, insert it into result(a pointer)
//mutex avoid different thread insert the value at the same time
}
}
pthread_exit(NULL);
}
然而,如果我没有使用pThread方法来做这件事,那就没有任何区别了。如何实现checkPermissible()以获得多线程的优势?我对这些东西很困惑。
我的想法是,在每个Thread中将数组划分为noOfThread。例如,我有一个数组[20]和4个线程,
Thread 1: compute checkCondition with array[0] to array[4]
Thread 2: compute checkCondition with array[5] to array[9]
Thread 3: compute checkCondition with array[10] to array[14]
Thread 4: compute checkCondition with array[15] to array[19]
类似的东西,我不知道如何实现。
答案 0 :(得分:1)
首先,您可以将下限和上限或地址传递给结构中的线程,如下所示:
struct readThread {
int low;
int hi;
int * myarray;
};
for (int i=low;i<hi;++i)
//or
struct readThread {
int * start;
int * end;
};
for (int* i=start; i<end; ++i)
第一个也更容易理解。这样,你的数组就会分裂。
还有其他方法可以为每个线程创建错误的拆分副本。