gpt4 book ai didi

c - 线程在等待变量更改时陷入无限循环

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:49 25 4
gpt4 key购买 nike

这是我的线程学习测试的一段代码:

int mylock = 0;

void *r1(void *x)
{
puts("entered r1");
int *p;
p = (int *)x;
int i = *p;
sleep(1);
*p = --i;
printf("r1: %d\n",*p);
mylock = 1;
printf("r1: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}

void *r2(void *x)
{
puts("entered r2");
if (!mylock) {
puts("r2 is waiting...");
while (!mylock)
printf("");
}
int *p;
p = (int *)x;
int i = *p;
*p = ++i;
sleep(1);
printf("r2: %d\n",*p);
printf("r2: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}

main()
{
int i1,i2;
i1 = 1;
i2 = 2;
printf("i1: %d\n", i1);
#ifdef USETHREADS
pthread_t r1_thread, r2_thread;
pthread_create(&r1_thread, NULL, r1, &i1);
pthread_create(&r2_thread, NULL, r2, &i1);
pthread_join(r1_thread, NULL);
pthread_join(r2_thread, NULL);
#else
r1(&i1);
r2(&i1);
#endif
printf("i1: %d\n", i1);
return 0;
}

所以有两个线程,一个在增加 i1,一个在减少(我知道 pthreads 中的“互斥体”,虽然此时没有使用),所以为了避免竞争条件,我创建了 mylock(我猜这是伪造的互斥体),并且令我感到惊讶的是,在等待 mylock 更改值时,进程陷入了一个未定义的循环,除非我在等待循环中调用 printf,而 printf 调用它仅在正如预期的那样 2 秒,这是 Linux 的谜团吗?

最佳答案

您的程序在未同步的情况下通过访问 mylock 调用未定义的行为。您需要在访问它之前调用 pthread_mutex_lock(在您选择保护 mylock 状态的互斥锁上),并在您访问它时调用 pthread_mutex_unlock重做。当然,那么mylock大概就没用了;您可以直接使用 pthread_mutex_lock 进行锁定。

话虽如此,如果您正在尝试学习线程,那么您将以完全错误的方式进行学习。您不会从尝试滚动自己的同步原语开始。在大多数情况下,你永远不应该这样做,即使你是专家,除非你真的有不寻常的需求,即使那样这也可能是一个坏主意。给自己一个好的线程教程,教您如何正确使用同步原语,然后使用它们

关于c - 线程在等待变量更改时陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18815858/

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