c - 多线程中的数组迭代

标签 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. 变量i不是共享的(例如,它应该是一个全局变量),也不是在关键部分中(它是每个线程的局部变量)。要拥有关键部分,您应该使用锁或事务内存。

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

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

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

我建议您从一些教程开始,例如 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;
}

关于c - 多线程中的数组迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723817/

相关文章:

c# - 如何实现简单的多线程功能

java - 如何让 For 循环在线程结束后继续?

java - 将图像转换为灰度图像时应用程序没有响应

c - 高效的C/C++多线程程序可对数据进行分区和处理

iphone - iOS并发/版本分发

c - 理解C中if、else if、else的控制流

c - 指向接受 int 参数并返回 void 的函数指针数组的指针

c - fork输出不正确

c - 字符串中间的 '\0'在C中能被识别为字符串的结尾吗?

c++ - 二进制数据包的 32 位逐位异或非值