是qDebug()线程安全的?通过线程安全我不仅仅意味着不崩溃,而且如果我qDebug()从不同的线程调用,输出是否可能变得混乱?我用这个代码测试了它,但它看起来并不是这样,但是,我在文档中的任何地方都找不到它们所讨论的内容.
这是我的测试代码:
#include <QtConcurrent>
#include <QApplication>
void print_a() {
for (int ii = 0; ii < 10000; ii++) {
qDebug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
void print_b()
{
for (int ii = 0; ii < 10000; ii++) {
qDebug("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtConcurrent::run(print_a);
QtConcurrent::run(print_b);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
在任何地方都没有'a'和'b'混合在同一行,但我仍然不确定它是否100%线程安全......
fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入.
编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程.
查看该文件,一些写入混合在一起.
编辑2:我看到的问题似乎可能是由于lighttpd的"工作线程"实际上是单独的进程: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor
问题
通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点:
- mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步.
- mod_status将有n个独立的计数器,每个进程一个.
- mod_rrdtool将失败,因为它收到两次相同的时间戳.
- mod_uploadprogress将不会显示正确的状态.
我正在为就餐野人问题的某些变量编写C解决方案。现在,我创建线程,每个线程都将FILE *发送到相同的调试文件。在线程内部,我正在使用fprintf()进行一些打印。打印的报表不受任何互斥量等的保护。
我在调试文件中没有观察到任何交错行为;似乎它是线程安全的,尽管我在网上找不到无处不在的明确声明。
我看到的是以下内容:
fprintf是线程安全的fprintf需要线程安全我之所以这样问,是因为这是一项可以完成的大学作业,但是我仍然怀疑在另一台基于Windows的计算机中,由于上述不确定性,该程序可能会引起问题。
我将附加线程代码,因此您将看到prinintg没有受到保护:
DWORD WINAPI RoomateThread(LPVOID lpParam) {
/*=================================================
"RoomateThread" this is the roomate thread handler function where
the thread logic is implemented
Input: 1. lpParam holds a roomate, runtime and pointers to both files
Output: 1. return an DWORD value {0}->Success {-1}->Failure
2. A code telling if the run was successful (debug file)
A roommate follows this logic after wake up:
1. If there are clothes available in …Run Code Online (Sandbox Code Playgroud)