我有简单的代码:第一线推std::strings到std::list,及第二线程弹出std::strings此std::list.所有std::list的操作都受到保护std::mutex m.此代码将错误永久打印到控制台:"Error: lst.begin() == lst.end()".
如果我替换std::lock_guard为构造m.lock(),m.unlock()代码开始正常工作.有什么问题std::lock_guard?
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
#include <string>
std::mutex m;
std::list<std::string> lst;
void f2()
{
for (int i = 0; i < 5000; ++i)
{
std::lock_guard<std::mutex> { m };
lst.push_back(std::to_string(i));
}
m.lock();
lst.push_back("-1"); // last list's element
m.unlock();
}
void f1()
{
std::string str;
while (true)
{
m.lock();
if (!lst.empty()) …Run Code Online (Sandbox Code Playgroud)