我有以下示例,假设我希望每个线程从 0 计数到 9。
void* iterate(void* arg) {
int i = 0;
while(i<10) {
i++;
}
pthread_exit(0);
}
int main() {
int j = 0;
pthread_t tid[100];
while(j<100) {
pthread_create(&tid[j],NULL,iterate,NULL);
pthread_join(tid[j],NULL);
}
}
变量 i - 位于关键部分,它将被多次覆盖,因此线程将无法计数。
int* i=(int*)calloc(1,sizeof(int));
也没有解决问题。我不想使用互斥体。这个问题最常见的解决方案是什么?
最佳答案
正如其他用户评论的那样,您的示例中存在几个问题:
变量
i
不是共享的(例如,它应该是一个全局变量),也不是在关键部分中(它是每个线程的局部变量)。要拥有关键部分,您应该使用锁或事务内存。您不需要每次迭代都创建和销毁线程。只需在开始时创建多个线程并等待它们完成(join)即可。
pthread_exit()
不是必需的,只需从线程函数返回(带有值)即可。对于线程来说,计数器是一个不好的例子。它需要原子操作以避免覆盖其他线程的值。实际上,多线程计数器是为什么需要原子访问的典型示例(例如,请参见 this tutorial)。
我还推荐像 OpenMP 这样的框架,它们简化了多线程程序的语义。
编辑:共享计数器和 4 个线程的示例。
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 4
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int counter = 0;
void* iterate(void* arg) {
int i = 0;
while(i++ < 10) {
// enter critical section
pthread_mutex_lock(&mutex);
++counter;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
int j;
pthread_t tid[NUM_THREADS];
for(j = 0; j < NUM_THREADS; ++j)
pthread_create(&tid[j],NULL,iterate,NULL);
// let the threads do their magic
for(j = 0; j < NUM_THREADS; ++j)
pthread_join(tid[j],NULL);
printf("%d", counter);
return 0;
}
关于c - 多线程中的数组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723817/