gpt4 book ai didi

c - 多线程中的执行流程是怎样的?

转载 作者:行者123 更新时间:2023-12-01 15:09:15 27 4
gpt4 key购买 nike

我在多线程中遇到了问题。请考虑以下代码:

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

void* functionA(void*);
void* functionB(void*);


int main()
{
pthread_t tid[2];
pthread_attr_t arg;

for(int i = 0; i<2; ++i)
{
pthread_attr_init(&arg);

if(i == 0)
{
int x = 0;
pthread_create(&tid[i], &arg, functionA, (void*)&x);
}

else if(i == 1)
{
int x = 6;
pthread_create(&tid[i], &arg, functionB, (void*)&x);
}
}

// wait for both threads to finish execution...
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);

return 0;
}


//.........................DEFINATIONS........................

void* functionA(void* x)
{
int Index = *((int*)x);
printf("First: %d\n",Index); //..................... LINE M
}


void* functionB(void* x)
{
int Index = *((int*)x);
printf("Second: %d\n",Index); //....................... LINE N
}

现在我相信 functionA 将首先开始执行,因为当然 functionA 的线程将首先在 for 循环中创建,所以根据我的输出应该是:

  First: 0                         (from Line M)
Second: 6 (from Line N)

但实际输出是,

  Second: 6
First: 6

现在看到这个我真的很吃惊,不知道怎么回事。不仅 secondFunction 首先开始执行,而且两个函数都显示相同的值,即 6,这对我来说没有意义。谁能解释一下这里发生了什么????提前致谢...

最佳答案

两件事

1) 这里 x 变量的作用域仅限于 if block 。所以在你的线程函数中,当你访问该指针时,它的范围已经消失所以你正在访问线程函数中的非法内存,这是错误的,它会产生未定义的行为。

回应您的一条评论

那么有什么方法可以直接发送一个常量而不是变量,例如 pthread_create(&tid[i], &arg, functionA, 6) ??

POSIX threads is a C API. C does not provide language facilities like copy constructors and so it is not possible to copy any object by value.

你需要始终只通过指针传递一些东西。

2) 线程执行的优先级完全取决于操作系统和调度,您不能假设这些线程的顺序。

你仍然希望在线程之间进行一些同步,然后使用互斥锁、条件变量等。

关于c - 多线程中的执行流程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084669/

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