qDebug()
和 std::cout
被认为不是线程安全的,因为它们的文档没有提及任何有关线程安全的内容。
C++ 和 Qt 中的线程安全打印语法有哪些?
最佳答案
两者都是线程安全的,因为它们不会导致您的程序崩溃。此外,输出是安全的,因为所有发送到流的字符都将打印为它们的预期值,例如
Thread A sends: {a,b,c,d}
Thread B sends: {1,2,3,4}
一个有效的输出可以是 {a,b,1,2,3,c,d,4} 但你永远不会看到不属于那个集合的字符,例如{m}。
为了序列化您的输出,您应该通过一些全局可访问的机制使用最少的互斥。
例如一个简单的类就可以做到这一点
class printsafe{
private:
typedef std::mutex t_lock;
static t_lock l_print;
public:
static void print(std::string const & s}
{
std::lock_guard<printsafe::t_lock> l;
std::cout << s ; // or qDebug(s.c_str());
}
};
现在你的输出将是 {abcd1234} 或 {1234abcd} 鉴于此
thread A sends: abcd
thread B sends: 1234
关于c++ - 哪些是 C++ 和 Qt 中的线程安全打印语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34387916/