C++ 将数据打印到文件中

C++ 将数据打印到文件中,c++,multithreading,C++,Multithreading,我重载了在向流发送数据时是否锁定了互斥锁?C++流类不是线程安全的。 实际上,线程之间存在同步问题。 例如,使用2个线程:(字符串的cout由“print”字符表示) 结果将是: helhloe llo 您需要确保两个线程不会同时使用您的函数 function_cout_hello() lock() file << ... unlock() function\u cout\u hello() 锁() 文件创建一个队列并写入。以期望的粒度排队列-例如一行(我想这就是您希

我重载了
在向流发送数据时是否锁定了互斥锁?C++流类不是线程安全的。

实际上,线程之间存在同步问题。

例如,使用2个线程:(字符串的cout由“print”字符表示)

结果将是:

helhloe
llo
您需要确保两个线程不会同时使用您的函数

function_cout_hello()
  lock()
  file << ...
  unlock()
function\u cout\u hello()
锁()

文件创建一个队列并写入。以期望的粒度排队列-例如一行(我想这就是您希望从示例中得到的)

比如:

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);
}
CRITICAL_段cs;
列表队列;
空写(字符串行)
{
肠危重科(&cs);
_排队。向后推(线);
离开关键部门(&cs);
}
ThreadProc()
{
而(!\u应该停止)
{
出列();
睡眠(100);
}
}
无效出列()
{
肠危重科(&cs);
如果(!\u queueIsEmpty())
{
字符串行=_queue.front();
_queue.pop_front();

流你能告诉我们一些代码吗?如果你天真地创建多个线程并启动它们输出,就没有保证它的顺序。当我用互斥锁它…O/P是正确的…为什么我要得到这个PRB如果我不锁定它与互斥??@玛努:为什么你认为这是“问题”?您启动了8个线程来做相同的事情。它们同时都在做相同的事情。除了您看到的以外,您为什么还期望其他事情呢?@John我想他只是在将8个线程中的消息打印到一个标准输出中。@Manu因为大多数c++03类都不是线程安全的。现在我想起来了,有没有一个c++03类是线程安全的安全?这有点过头了。
ostream
用于格式化输出。格式化可以在每个线程上并行完成;您只需要同步输出部分。@MSalters:这是一个很好的观点。但是我同意您的观点,但您仍然需要注意一些事情。操纵器std::endl将刷新osteam bu的内容看在上帝的份上,对于那些需要被锁定(或者你需要手动控制缓冲区内容何时会在文件中刷新)的文件,你能发表评论而不是-1-ing我吗?不是我的-1,而是当之无愧的。睡眠(100)?线程安全?缓冲区溢出?共享变量的无保护访问?有很多理由对此进行否决。我在评论中解决了所有这些问题。变量访问:关键部分。睡眠-如果您因为睡眠()同意否决,请使用WaitForSingleObject.Hm…mAlters,您可以对未提供带有setup.exe的DVD投反对票。Daniel击中了问题的靶心。我猜您也会对未提及InitializeCriticalSection和DeleteCriticalSection投反对票。。。
function_cout_hello()
  lock()
  file << ...
  unlock()
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);
}