Я пытаюсь настроить состояние гонки, чтобы увидеть, как это происходит, чтобы получить понимание. Я написал код ниже. Это компилируется без каких-либо проблем, но когда я запускаю его, он не печатает счетчик при каждом запуске. Если запустить его дважды или трижды, то печатается счет. Правильно ли я понимаю, что в этом коде не обязательно, чтобы состояние гонки действительно имело место. (если это правильно, то я не уверен, как это происходит, поскольку граничных условий нет!). Может ли кто-нибудь дать мне некоторое представление, если мое понимание неверно или код?
Спасибо.
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
void *banking(void *);
int main(){
int accounts[2]={0,0};
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,banking,(void *)accounts))
{
perror("pthread_create");
return 1;
}
if(pthread_create(&tid2,NULL,banking,(void *)accounts))
{
perror("pthread_create");
return 1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);//program now goes into infinite loop.
return 0;
}
void *banking(void * accounts){
int *ptr=accounts;
int count=0;
do{
int temp1=ptr[0];
int temp2=ptr[1];
int amount=rand();
ptr[0]=temp1-amount;
ptr[1]=temp2+amount;
//printf("%d \n %d\n",ptr[0],ptr[1]);
count++;
}while((ptr[0]+ptr[1])==0);
printf("%d\n",count);
//return NULL;
exit(0);
}
Я пытался реализовать pthread_exit(NULL) для достижения логики, при которой поток завершался бы после завершения цикла do-while, но, насколько я понимаю, другой запущенный поток не остановится таким образом, из-за чего программы переходят в бесконечный петля. Я понял, что exit() из любого потока завершает процесс и включил exit(0) . Код отлично работает для некоторых значений, но случайным образом генерирует два разных значения «счетчика». Это происходит раз в 10-12 попыток. Пожалуйста, предложите, целесообразно ли использование выхода в многопотоковой функции и в какой ситуации у меня будет два разных значения count.
pthread_create
- вы, вероятно, хотитеtid2
для первого параметра. Обратите внимание, что если бы вы скомпилировали с помощьюgcc -Wall
, вы бы получили предупреждение компилятора об этом и сэкономили время на отладку. - person Paul R   schedule 19.09.2011