关于套接字通信的线程

Thread about socket communication

本文关键字:线程 通信 套接字      更新时间:2023-10-16

我想制作函数,当从套接字接收缓冲区时,线程使整个程序冻结在我的函数之外,直到我的函数完成。我尝试这些如下

函数侦听

void Listen(can* _c) {
while (true)
{
std::lock_guard<std::mutex>guard(_c->connection->mutex);
thread t(&connect_tcp::Recv_data,_c->connection,_c->s,ref(_c->response),_c->signals);
if (t.joinable())
t.join();
}
}

功能dataset_browseCan

void dataset_browseCan(can* _c) {
thread org_th(Listen, _c); // I call thread here
org_th.detach();
dataset_browse(_c->cotp, _c->mms_obj, _c->connection, _c->response, _c->list, _c->size_encoder, _c->s);
dataset_signals_browse(_c->cotp, _c->mms_obj, _c->connection, _c->response, _c->list, _c->size_encoder, _c->s);
Sleep(800);
_c->signals = new Signals[_c->response.real_signals_and_values.size()];
}

函数接收数据

void connect_tcp::Recv_data(SOCKET s,mms_response &response,Signals *signals) {
LinkedList** list = new LinkedList * [1000];
uint8_t* buffer = new uint8_t [10000];
Sleep(800);
/*std::lock_guard<std::mutex>guard(mutex);*/
thread j(recv,s, (char*)buffer, 10000, 0);
j.join()
/*this->mutex.unlock();*/
decode_bytes(response,buffer, list,signals);
}

我尝试了互斥体和 this_thread::sleep_for((,但每次我的主函数都继续运行。 是否可以使程序冻结?

你使用线程是为了允许事情继续运行,而其他事情正在发生,所以想要"停止main"似乎是违反直觉的。

但是,如果要在线程之间共享数据(例如,在运行main的线程和后台线程之间(,则需要使用某种形式的同步。一种方法是使用std::mutex.如果在每次访问之前锁定互斥锁,然后在之后(使用std::lock_guardstd::unique_lock(解锁它,那么它将阻止另一个线程在您访问数据时锁定相同的互斥锁。

如果需要长时间阻止并发访问,则不应一直持有互斥锁。请考虑线程是否是解决问题的最佳解决方案,或者使用受互斥锁保护的标志来指示数据是否已准备就绪,然后轮询或使用std::condition_variable或类似方法等待该标志设置完毕。