gpt4 book ai didi

c - 带 sleep 的 C 线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:52 26 4
gpt4 key购买 nike

我正在学习 C 线程概念,并编写了下面的简单代码。现在,当我编译并运行它时,我得到了随机行为,例如意外打印。

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

void * func_threadName(void * i) {

int *x=(int *)i;
printf("I'm thread : %d\n",*x);

return NULL;
}
main()
{
int iter;
printf("testing multithreading....\n");

pthread_t thread_arr[3];

for (iter=0;iter<3;iter++)
{
pthread_create(&thread_arr[iter],NULL,func_threadName,&iter);

}

for (iter=0;iter<3;iter++)
{
pthread_join(thread_arr[iter],NULL);
}
}

它打印出不可预测的样子:

diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o 
testing multithreading....
I'm thread : 0
I'm thread : 0
I'm thread : 0
diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o
testing multithreading....
I'm thread : 0
I'm thread : 2
I'm thread : 1
diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o
testing multithreading....
I'm thread : 2
I'm thread : 2
I'm thread : 0

但是,当我在创建线程后进行如下所示的轻微更改时,它可以完美运行并按顺序打印。

pthread_create(&thread_arr[iter],NULL,func_threadName,&iter);
sleep(1);

现在输出每次都是这样:

diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o 
testing multithreading....
I'm thread : 0
I'm thread : 1
I'm thread : 2
diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o
testing multithreading....
I'm thread : 0
I'm thread : 1
I'm thread : 2
diwakar@diwakar-VPCEH25EN:~/Documents/my_C_codes$ ./thread_test.o
testing multithreading....
I'm thread : 0
I'm thread : 1
I'm thread : 2

我想了解在第一种情况下,是否显示了不可预测的行为,因为所有线程共享相同的内存空间,因此在一个线程终止之前,其他线程使用相同的 i 值?欢迎提供任何其他信息。

最佳答案

您无法准确地告诉何时线程将要运行,因此主线程可能会继续运行,从而更改其循环中的计数器。由于该循环计数器是一个指针,因此所有线程都有相同的指针指向完全​​相同的变量。您还在第二个循环中使用相同的变量,因此它可以在线程的生命周期内被修改两次。

“按原样”传递数字会更好(虽然更“hackish”):

pthread_create(&thread_arr[iter], NULL, func_threadName, (void *) iter);

然后在线程函数中这样获取:

int x = (int) i;

关于c - 带 sleep 的 C 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870528/

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