c++ - 哪些是 C++ 和 Qt 中的线程安全打印语法?

标签 c++ qt thread-safety

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/

相关文章:

java - 为什么同步不起作用?

c++ - `std::basic_string` 和 `std::__1::basic_string` 之间有什么区别?

c++ - GraphicsScene 中的轴承公式计算产生不稳定的结果

java - 阻塞队列的实现

c++ - Worker/Controller 多线程和接口(interface)类

c++ - 不用IDE运行Qt程序

python - 如何包装 Python 迭代器以使其线程安全?

c++ - 为什么我不能从 const String& 方法返回 NULL?

C++ 对多个类使用相同的 ADT 结构

c++ - 如何高效地表达这个功能