gpt4 book ai didi

c - 多个线程一起打印值

转载 作者:行者123 更新时间:2023-11-30 14:57:29 30 4
gpt4 key购买 nike

我试图理解为什么我在线程中运行此代码时得到这个答案。我不明白为什么我每次都没有得到不同的值(value)。 enter image description here

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

void *printHello(void *threadid)
{
int tid = *(int*)threadid;

printf("Hello World! It's me, thread #%d!\n", tid);

pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
int i;

for (i = 0; i < NUM_THREADS; i++)
{
printf("In main: creating thread %ld\n", i,);

rc = pthread_create(&threads[i], NULL, printHello, &i);

if (rc)
{
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}

pthread_exit(NULL);
}

所有线程都会等到它们创建完成然后才转到 printHello 函数吗?

最佳答案

当你创建一个新线程时,线程的执行顺序没有固定的顺序。主线程和新创建的线程将简单地彼此并发运行。

与您的 i 变量相关的问题是您将 i地址传递给 pthread_create 功能。由于此变量会在后续循环迭代中更新,因此当您通过其地址(从 printHello 回调函数内)访问它时,其值将会更改。在输出中,我们可以看到 main 函数中的循环在任何生成的线程输出任何内容之前就已完成,因为 i 已达到 NUM_THREADS 已经限制了。

如果您希望事情具有确定性,则创建一个新变量来保存线程 ID,并传入该线程的地址位置:

int threadIds[NUM_THREADS];
int rc;
int i;

for (i = 0; i < NUM_THREADS; i++)
{
threadIds[i] = i;
rc = pthread_create(&threads[i], NULL, printHello, threadIds + i);
}

此外,阻塞主线程,直到所有生成的线程完成执行,并且不要在 main 函数中调用 pthread_exit。它不在 pthread 内运行,因此不需要退出。

关于c - 多个线程一起打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43891788/

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