两天前我参加了一次面试。受访者擅长 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。所以,我的结论是没有那个锁就可以工作,但这不是正确/标准的方式。现在,我想知道谁是正确的,在哪个基础上?