Я столкнулся с проблемой многопоточности. Пожалуйста, обратите внимание на следующий код:Каков поток выполнения в многопоточном режиме, C?
#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 будет создан первый в цикл, так что по мне вывод должен быть:
First: 0 (from Line M)
Second: 6 (from Line N)
но фактический выход,
Second: 6
First: 6
Теперь я действительно удивлен, увидев это, и я не знаю, что происходит. Не только secondFunction начинает свое выполнение сначала, но и обе функции показывают одинаковое значение, то есть 6, и это не имеет смысла для меня. Может ли кто-нибудь объяснить Объясните мне, что здесь происходит ???? Заранее спасибо ...
'x' выходит из сферы действия, как только вы создаете свою нить, поэтому ваш код демонстрирует UB. –
Попробуйте сделать это в ваших потоках: 'printf ("% p \ n ", x);', я думаю, вы увидите, что указатель для обоих потоков одинаковый, потому что ваш 'int x = 0/6; 'находятся в локальной области, поэтому они могут быть выделены по тому же адресу. –
Итак, вы используете потоки, но вы ожидаете определенного порядка исполнения между ними? Как вы думаете, какая разница между запуском потока и вызовом метода? – davmac