我的程序中有一些线程出现问题
我是这个主题材料的新手
我正在尝试在2个不同的对象函数上启动2个线程,似乎它们不能同时工作(t1工作,而t2不工作)..
编辑: t1的功能有效,但t2不起作用。我检查了t2和t1,他们自己工作,但是像t1一样阻止t2工作
这里是主要的:
MessagesSender MSM=MessagesSender();
MSM.Push_user("ronik");
MSM.Push_user("ligal");
thread t1(&MessagesSender::DataRead,&MSM);
thread t2(&MessagesSender::DataSend, &MSM);
t1.join();
t2.join();
return 0;
这里是t1的函数:
void MessagesSender::DataRead()
{
ifstream file_read;
ofstream file_delete;
string line;
while (true)
{
file_read.open("data.txt"); // opens the file
mtx.lock(); // locks the use of THOR
while (getline(file_read, line)) // reads to THOR
{
cout << "im reading now" << endl;
this->THOR.push(line);
}
mtx.unlock(); // unlock the use of THOR
file_read.close(); // closes the file for reading
file_delete.open("data.txt", ios::out | ios::trunc);/// opens the file and deletes the content/data
file_delete.close(); // closes the file
cout << "im sleeping now" << endl;
print_THOR();
this_thread::sleep_for(chrono::seconds(30)); // makes the thread sleep for 1 minute
}
}
这是t2的功能:
void MessagesSender::DataSend()
{
ofstream file_send;
file_send.open("output.txt");
set<string>::iterator SEI;
while (true)
{
mtx.lock();
while (!THOR.empty()) // while that prints all the THOR lines
{
for (SEI = ConUsers.begin(); SEI != ConUsers.end(); SEI++) /// to print the users
{
if (THOR.empty())
{
break;
}
string p2(THOR.front());
cout << "im sending now" << endl;
file_send << *SEI << ": " << p2 << endl;
}
}
mtx.unlock();
THOR.push("im empty");
print_THOR();
this_thread::sleep_for(chrono::seconds(30));
}
file_send.close();
}
答案 0 :(得分:0)
我认为这可能是缓冲流的问题。您正在使用std::cout
并致电std::endl
。这会导致线程暂停,直到数据写入控制台(慢)。我以前做过这个并遇到同样的问题。 t2
正在挂起缓冲流,等待t1
使用它时清除它。尝试使用常规std::endl
替换'\n'
,然后在程序结束时执行std::cout << std::flush;
。