我已经得到了以下示例,让我们说我希望每个线程从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));
也没有解决问题。我不想使用互斥锁。这个问题最常见的解决方案是什么?
答案 0 :(得分:0)
正如其他用户正在评论一样,您的示例中存在多个问题:
变量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;
}