我已经重载了<<
运算符,以便它写入文件和控制台。我已经为同一个函数创建了8个线程,我想输出
hello
hi
如果我在无限循环中运行此线程例程,则文件中的o / p为
您好
喜
你好
喜
您好
喜
ELLO
我
您好
喜
您好
喜
LLO
我
您好
喜
这没有模式。问题是什么?我可以在控制台上正确打印它,但不能打印到文件中。
答案 0 :(得分:4)
在将数据发送到流时,是否锁定了互斥锁? c ++流类不是线程安全的。
答案 1 :(得分:2)
创建一个队列并写入它。以所需的粒度出列队列 - 例如一行(我猜这就是你想要的例子)。
类似的东西:
CRITICAL_SECTION cs;
list<string> _queue;
void Write(string line)
{
EnterCriticalSection(&cs);
_queue.push_back(line);
LeaveCriticalSection(&cs);
}
ThreadProc()
{
while (!_shouldStop)
{
Dequeue();
Sleep(100);
}
}
void Dequeue()
{
EnterCriticalSection(&cs);
if (!_queueIsEmpty())
{
string line=_queue.front();
_queue.pop_front();
stream << line;
}
LeaveCriticalSection(&cs);
}
这不是C代码 - 这只是一个例子,还有很多其他的东西需要考虑,仅举几例:
WaitForSingleObject()
代替Sleep()
- 在您想要停止时更好地控制案件答案 2 :(得分:0)
实际上你在线程之间存在同步问题。
例如2个线程:(字符串的cout用“print”字符表示)。
thread1 thread2
print h
print e
print l
print h
print l
print o
print e
print \n
print l
print l
print o
print \n
结果将是:
helhloe
llo
你需要确保两个线程不同时使用你的功能。
function_cout_hello()
lock()
file << ...
unlock()
就像那样,两个不同的线程不能同时使用该功能。