gpt4 book ai didi

c - 多个线程如何更改互斥锁锁定的静态变量

转载 作者:行者123 更新时间:2023-11-30 15:07:49 25 4
gpt4 key购买 nike

作为线程的初学者,我在理解互斥体的逻辑如何工作方面有点困难。需要帮助来理解以下代码片段中的多线程工作原理以及每个 foo() 调用的 x 的输出是什么:

foo()
{
static int x;
X_lock(); //locking
x++;
X_unlock; //unlocking
return x;
}

信号量和互斥体之间的基本区别是什么?一个简单的例子就很好了。

最佳答案

有时线程需要使用相同的资源,并且可能会调用未识别的行为。例如,加法不是原子操作,因此可能会导致此问题。因此,不同线程之间需要某种屏障,只有一个线程可以通过该屏障,其他线程必须等待该线程完成,一个线程完成后,下一个线程穿过屏障等必须等待线程完成。

这是竞争条件的一个示例,MUTEX(互斥)用于此目的。互斥体如何工作?首先,您必须在主函数中初始化互斥锁:

pthread_mutex_init(&lock, NULL).

变量pthread_mutex_t lock;是全局的,因此每个线程都可以访问它。之后,一个线程将锁定互斥量:

pthread_mutex_lock(&lock);

现在,下一个线程到达同一点,到达我刚刚编写的这行代码,并且无法通过它。因此,所有其他线程都必须在此屏障处等待 - 这行代码,直到第一个线程解锁互斥体:

pthread_mutex_unlock(&lock);

然后,根据哪个线程从操作系统获取处理器时间将通过槽屏障,并且相同的事情会再次重复。

互斥体是需要理解的非常重要的概念。至于信号量,它们用于相同的事情,线程同步,here是一篇涵盖该主题的优秀文章。

关于c - 多个线程如何更改互斥锁锁定的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37916655/

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