这段代码演示了互斥锁在两个线程之间共享,但是在thread_mutex
.
(我在另一个问题中有此代码的变体,但这似乎是第二个谜。)
#include <thread>
#include <mutex>
#include <iostream>
#include <unistd.h>
int main ()
{
std::mutex m;
std::thread t ([&] ()
{
while (true)
{
{
std::lock_guard <std::mutex> thread_lock (m);
usleep (10*1000); // or whatever
}
std::cerr << "#";
std::cerr.flush ();
}
});
while (true)
{
std::lock_guard <std::mutex> main_lock (m);
std::cerr << ".";
std::cerr.flush ();
}
}
这基本上可以正常工作,但是thread_lock
理论上应该不需要范围块。但是,如果您将其注释掉...
#include <thread>
#include <mutex>
#include <iostream>
#include <unistd.h>
int main ()
{
std::mutex m;
std::thread t ([&] ()
{
while (true)
{
// {
std::lock_guard <std::mutex> thread_lock (m);
usleep (10*1000); // or whatever
// }
std::cerr << "#";
std::cerr.flush ();
}
});
while (true)
{
std::lock_guard <std::mutex> main_lock (m);
std::cerr << ".";
std::cerr.flush ();
}
}
输出是这样的:
........########################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
即,似乎thread_lock
从不屈服于main_lock
.
如果删除了冗余范围块,为什么thread_lock
总是获得锁并总是等待?main_lock