提问人:Rafik Bouloudene 提问时间:10/21/2023 最后编辑:Brian61354270Rafik Bouloudene 更新时间:10/27/2023 访问量:115
为什么使用线程 C 时,指令有时会执行两次
Why is an instruction being sometimes executed twice when using threads C
问:
我有以下代码,它基本上创建了两个线程,一个读取一个字符,另一个键入它,直到传递字母 f:
char c;
int att = 1;
void* th_read(void *k){
do {
while(!att);
printf("type a character : ");
scanf(" %c",&c);
att = 0;
}while(c != 'f');
exit(0);
}
void* th_write(void *k){
do {
while(att);
printf("character typed is : %c \n",c);
att = 1;
}while(c != 'f');
exit(0);
}
void main(){
int i;
pthread_t pth_id[2];
pthread_create(&pth_id[0], 0,th_read,NULL);
printf("Main: reading thread created with id = %ld\n", pth_id[0]);
pthread_create(&pth_id[1], 0,th_write,NULL);
printf("Main: writing thread created with id= %ld\n",pth_id[1]);
for(i = 0; i < 2; i++) pthread_join(pth_id[i],NULL);
exit(0);
}
我的问题是,当用户键入“f”时,指令有时会执行两次。printf("character typed is : %c \n",c);
例:
答:
0赞
DarkFranX
10/27/2023
#1
这可能是由于共享(全局)变量的未受保护的非原子使用而导致的竞争条件。
我建议你通读整个 https://deadlockempire.github.io/ 系列,这是进入多线程概念的一个很好的起点。
评论
exit(0)
exit()
c
while(att);
不会太好用。要么做:要么更好:使用基元:并用volatile int att = 1;
stdatomic.h
while (atomic_load(&att));
atomic_store(&att, some_value);