【发布时间】:2020-10-27 14:00:01
【问题描述】:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
std::mutex g_m;
std::string messageGlobal = "";
void threadFunc() // run in the log thread
{
while (1)
{
g_m.lock();
if (messageGlobal != "")
{
// logging takes a long time
sleep(10000)
cout << messageGlobal << endl;
messageGlobal = "";
}
g_m.unlock();
}
}
// logging api
void log(const string& message)
{
g_m.lock();
messageGlobal = message;
g_m.unlock();
}
int main()
{
std::thread th(threadFunc);
log("Hello world!");
log("Hello World2!");
log("Hello World3!");
log("Hello World4!");
// Important work
th.join();
return 0;
}
这里是线程新手,我不明白为什么只打印最后一条消息。
这里的两个线程是主线程和一个额外的线程,它永久运行并在有消息要打印时输出到屏幕。
如果有人告诉我我哪里出错了,我将不胜感激。
编辑:目标是在非常长的日志记录功能发生时执行“重要代码”中的代码。
【问题讨论】:
-
有几种合法的可能输出,没有任何地方可以优先选择其中一种。在您的情况下,主线程看起来足够快,以至于
unlock()和下一个lock()之间的时间太短,以至于其他线程没有时间唤醒并显示消息。 -
启动线程需要时间。这意味着
log甚至可以在th开始执行之前完成threadFunc -
在 MT 编程中您需要意识到的一件事——您看到的顺序并不是可能发生的事情。仅仅因为您看到
std::thread在 main() 中首先出现并不意味着线程函数将首先运行。这也是 MT 编程不是一个小话题的原因之一。 -
非常感谢,在thread start语句后面加上sleep语句,保证了主线程去log函数之前线程已经启动运行。
-
sleep没有任何问题,如果您打算在这段时间内实际睡眠,即不必尝试让 MT 程序正常工作。如果使用sleep的目的是让线程同步,那么是的,代码是可疑的。
标签: c++ multithreading mutex