我已经重载了<<
运算符,以便它可以写入文件并在控制台上写入。我已经创建了8个线程,以相同的功能,我想输出将数据打印到文件
hello
hi
如果我在一个无限循环中运行此线程程序文件中的O/P是
你好
喜
你好
喜
你好
喜
ELLO
我
你好
喜
你好
喜
LLO
我
你好
喜
这有没有图案。问题是什么?我能够在控制台上正确打印它,但不能将其打印到文件中。
我已经重载了<<
运算符,以便它可以写入文件并在控制台上写入。我已经创建了8个线程,以相同的功能,我想输出将数据打印到文件
hello
hi
如果我在一个无限循环中运行此线程程序文件中的O/P是
你好
喜
你好
喜
你好
喜
ELLO
我
你好
喜
你好
喜
LLO
我
你好
喜
这有没有图案。问题是什么?我能够在控制台上正确打印它,但不能将其打印到文件中。
创建一个队列并写入它。以期望的粒度出队队列 - 例如一行(我想这就是你想要的例子)。
喜欢的东西:
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()
-ing有病例更好的控制,当你想停止对于上帝的爱,你可以评论而不是 - 1我? – 2010-11-17 09:48:53
不是我的-1,但是当之无愧。睡眠(100)?线程安全?缓冲区溢出?不受保护的共享变量访问?有很多原因可以降低这一点。 – MSalters 2010-11-19 15:47:08
我在评论中解决了所有这些问题。变量访问:关键部分。睡眠 - 使用WaitForSingleObject。嗯... – 2010-11-19 17:51:00
当您将数据发送到流时是否锁定互斥锁? C++流类不是线程安全的。
当我使用互斥锁来锁定... o/p是正确的...为什么我得到这个概率,如果我不锁定互斥锁? – Manu 2010-11-17 06:34:08
@Manu:你为什么认为这是一个“问题?” – 2010-11-17 06:34:47
你开始做8个线程做同样的事情。他们都在同一时间做同样的事情。为什么你会期望除了你看到的东西以外的其他东西 – 2010-11-17 06:35:18
其实你有一个线程之间的同步问题。
例如有2个线程:(字符串的cout用“打印”字符表示)。
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()
这样,两个不同的线程不能同时使用的功能。
你能告诉我们一些代码吗? – birryree 2010-11-17 06:27:26
如果你只是天真地创建几个线程,并开始喷射输出,那么它的顺序就没有任何保证。 – Cascabel 2010-11-17 06:28:53
Thx回答接受。 – 2010-11-24 21:04:12