我有一个服务器,它可以接受两个套接字连接。它为每个套接字创建一个线程,以便可以并行发送消息。
套接字:多线程在客户端读取消息时不工作
现在我试图编写我的客户端。
我创建了一个名为SocketThread
的类作为套接字线程。下面是主要代码:
void SocketThread::ReadData()
{
int n = 0;
while (!finished)
{
while ((n = read(sockfd, recvBuff, sizeof(Data))) > 0)
{
std::cout<<std::this_thread::get_id()<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
}
}
std::thread SocketThread::run()
{
return std::thread([=] { ReadData(); });
}
在功能main
:
SocketThread s0("127.0.0.1", 10000);
SocketThread s1("127.0.0.1", 10000);
std::thread td0{sts[0].run()};
std::thread td1{sts[1].run()};
td0.join(); // stop here
td1.join();
// something else
当我执行程序时,它会阻止在td0.join();
,这意味着我可以得到线程td0
的id在控制台上,我永远不会得到另一个线程。
但是,当我删除(n = read(sockfd, recvBuff, sizeof(Data))) > 0
,这意味着现在客户端只是一个简单的线程,它不会收到任何东西,事情会很好----我可以得到两个线程的两个ID。
为什么?
编辑 看来我错误地使用了join
。
我需要的是main
不会执行//something else
,直到两个线程一起获得1000个字符。
我该怎么办?
我很难理解你的问题,但'read()'call默认是阻塞的。 –
@AbhinavGauniyal当我执行客户端时,'main'会在'td0.join()'处阻塞。为什么。 – Yves
,因为'join()'被阻塞。 'join()'在线程结束时返回。你想要做什么? – shrike