gpt4 book ai didi

C++ - 没有像 mutex_Lock 这样的协调机制的线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:45 26 4
gpt4 key购买 nike

我两天前参加了一次面试。面试的人擅长C++,但不擅长多线程。当他让我为两个线程的多线程编写代码时,其中一个线程打印 1,3,5,.. 而另一个打印 2,4,6,.. 。但是,输出应该是 1,2,3,4,5,.... 所以,我给出了下面的代码(sudo 代码)

mutex_Lock LOCK;
int last=2;
int last_Value = 0;

void function_Thread_1()
{
while(1)
{
mutex_Lock(&LOCK);
if(last == 2)
{
cout << ++last_Value << endl;
last = 1;
}
mutex_Unlock(&LOCK);
}
}

void function_Thread_2()
{
while(1)
{
mutex_Lock(&LOCK);
if(last == 1)
{
cout << ++last_Value << endl;
last = 2;
}
mutex_Unlock(&LOCK);
}
}

在此之后,他说“即使没有那些锁,这些线程也能正常工作。那些锁会降低效率”。我的意思是没有锁会有这样一种情况,一个线程将检查(last == 1 或 2),同时另一个线程将尝试将值更改为 2 或 1。所以,我的结论是它没有那个锁就可以工作,但这不是正确/标准的方式。现在,我想知道谁是正确的,依据是什么?

最佳答案

如果没有锁,同时运行这两个函数将是未定义的行为,因为在访问 lastlast_Value 时存在数据竞争此外(虽然不会导致 UB)打印将无法预测。

有了锁,程序本质上变成了单线程,并且可能比简单的单线程代码。但这只是问题的本质(即产生事件的序列化序列)。

关于C++ - 没有像 mutex_Lock 这样的协调机制的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383831/

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