一旦调用join(),我怎样才能恢复线程?

时间:2015-06-03 09:28:23

标签: c++ multithreading

在第一次调用它完成执行后,这是我的发送者线程。我无法恢复此发件人帖子。 C ++中是否有任何恢复线程的机制。

void ClientSocket::sender()
{


    char buf[1024]; 
        //readBuffer = m_ptrsendStream->Read_Adt(filePath);
        //readStream();
        //cout << readBuffer.str()<<endl;
        cout << "write stream to send through socket\n" << endl;
        cin >> buf;
        if (isConnected == 0)
        {

            //send(clientSock, readBuffer.str().c_str(), strlen((char *)readBuffer.str().c_str()), 0);
            send(clientSock, buf, strlen(buf), 0);
            cout << "sending stream :\n"<<endl << buf << endl;

        }

}

//this is where my thread creation happens and join() happens.

int  main(int argc, char *argv[])
{



    ClientSocket objSocket(argv[1]);

        sender_thread = make_shared<thread>([&objSocket]() {
            objSocket.sender();
        });



        try
        {


    if (sender_thread->joinable())
            sender_thread->join();

        }

3 个答案:

答案 0 :(得分:4)

不,一旦你的线程加入了它就完成了,你需要创建一个新的。

如果您有这种模式,您不断创建新线程,那么考虑使用线程池来避免不断产生新线程的开销可能是值得的。

此外,如果这与网络有关,最好避免使用线程,而是使用像boost::asio这样的异步。

答案 1 :(得分:3)

  1. 终止线程无法恢复(这不是C ++限制,而是一般限制;当谈到恢复线程时,通常是在先前挂起它后恢复)。

  2. join()返回后,相应的线程已经终止;它没有状态(除了zobmie的东西和返回代码,但这对你的目的没有用),没有什么可以恢复

  3. 但是,可以在另一个线程中运行sender()函数,只需创建线程的另一个实例。

  4. 编辑:我同意@inf尽可能使用asio代替线程。

答案 2 :(得分:0)

你想要完成的简历线程,通常使用的线程恢复从挂起的线程继续。而不是恢复线程,停止线程un直到它完成所有操作,利用while或等待线程。