线程对象函数c ++

时间:2017-02-02 17:10:50

标签: c++ multithreading

我的程序中有一些线程出现问题

我是这个主题材料的新手

我正在尝试在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();

}

1 个答案:

答案 0 :(得分:0)

我认为这可能是缓冲流的问题。您正在使用std::cout并致电std::endl。这会导致线程暂停,直到数据写入控制台(慢)。我以前做过这个并遇到同样的问题。 t2正在挂起缓冲流,等待t1使用它时清除它。尝试使用常规std::endl替换'\n',然后在程序结束时执行std::cout << std::flush;