多线程

时间:2018-02-10 17:52:42

标签: c multithreading

我已经得到了以下示例,让我们说我希望每个线程从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));

也没有解决问题。我不想使用互斥锁。这个问题最常见的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

正如其他用户正在评论一样,您的示例中存在多个问题:

  1. 变量i不是共享的(例如,它应该是全局变量),也不是临界区(它是每个线程的局部变量)。要拥有一个关键部分,你应该使用锁或事务性内存。

  2. 每次迭代都不需要创建和销毁线程。只需在开始时创建一些线程并等待它们完成( join )。

  3. pthread_exit()不是必需的,只需从线程函数返回(带值)。

  4. 计数器是线程的一个坏例子。它需要原子操作以避免覆盖其他线程的值。实际上,多线程计数器是为什么需要原子访问的典型示例(例如,参见this tutorial)。

  5. 我建议您从一些教程开始,例如thisthis

    我还推荐像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;
    }