gpt4 book ai didi

c - 多线程中的数组迭代

转载 作者:行者123 更新时间:2023-11-30 16:35:53 24 4
gpt4 key购买 nike

我有以下示例,假设我希望每个线程从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com