gpt4 book ai didi

c - 为什么 pthread_join 在此示例中没有正确关闭线程数组?

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:45 25 4
gpt4 key购买 nike

我正在尝试自学 pthreads 线程。我有以下源代码,可以正确编译和运行:

#include <stdio.h>
#include <pthread.h>

#define PTHREAD_COUNT 10
#define FREQ 5

void *thread_function(void *arg) {
int *incoming = (int *)arg;
int freqIdx;

for (freqIdx = 0; freqIdx < FREQ; freqIdx++)
fprintf(stdout, "Hello, world (thread %d)\n", *incoming);

return NULL;
}

int main(int argc, char **argv) {
pthread_t thread_IDs[PTHREAD_COUNT];
void *exit_status;
int threadIdx;

for (threadIdx = 0; threadIdx < PTHREAD_COUNT; threadIdx++) {
pthread_create(&thread_IDs[threadIdx], NULL, thread_function, &threadIdx);
pthread_join(thread_IDs[threadIdx], &exit_status);
}

return 0;
}

我得到以下结果:

Hello, world (thread 0)
Hello, world (thread 0)
Hello, world (thread 0)
Hello, world (thread 0)
Hello, world (thread 0)
Hello, world (thread 1)
...
Hello, world (thread 9)

如果我在一个循环中pthread_create 一个pthread_t 类型的数组,然后在一个单独的循环中pthread_join,那么事情就会失败:

#include <stdio.h>
#include <pthread.h>

#define PTHREAD_COUNT 10
#define FREQ 5

void *thread_function(void *arg) {
int *incoming = (int *)arg;
int freqIdx;

for (freqIdx = 0; freqIdx < FREQ; freqIdx++)
fprintf(stdout, "Hello, world (thread %d)\n", *incoming);

return NULL;
}

int main(int argc, char **argv) {
pthread_t thread_IDs[PTHREAD_COUNT];
void *exit_status;
int threadIdx;

/* here I split the thread _create and _join steps into separate loops */

for (threadIdx = 0; threadIdx < PTHREAD_COUNT; threadIdx++)
pthread_create(&thread_IDs[threadIdx], NULL, thread_function, &threadIdx);

for (threadIdx = 0; threadIdx < PTHREAD_COUNT; threadIdx++)
pthread_join(thread_IDs[threadIdx], &exit_status);

return 0;
}

这个输出是完全错误的。我不是从每个线程获取五个 fprintf 语句,而是从线程 2 和 3 获取一两个语句,从线程 0 获取大约 20 到 25 个 Hello, world 语句.

为什么会失败?

最佳答案

我看到的一个问题是您给它一个局部变量 threadIdx 的地址。当您在循环中修改它时,线程看到的值也会更改。因此 threadIdx 值将不正确。

在第二个循环中,您再次将 threadIdx 设置为 0 并等待线程完成,这就解释了为什么您看到很多线程都打印出线程 0。

您可以简单地传递 threadIdx,然后将 void *args 解释为 int 而不是(因为 sizeof(int) <= sizeof(void *) 并且通常在大多数机器上得到保证)并且您应该得到正确的输出。

关于c - 为什么 pthread_join 在此示例中没有正确关闭线程数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895908/

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