关于套接字通信的线程
Thread about socket communication
我想制作函数,当从套接字接收缓冲区时,线程使整个程序冻结在我的函数之外,直到我的函数完成。我尝试这些如下
函数侦听
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_guard
或std::unique_lock
(解锁它,那么它将阻止另一个线程在您访问数据时锁定相同的互斥锁。
如果需要长时间阻止并发访问,则不应一直持有互斥锁。请考虑线程是否是解决问题的最佳解决方案,或者使用受互斥锁保护的标志来指示数据是否已准备就绪,然后轮询或使用std::condition_variable
或类似方法等待该标志设置完毕。
相关文章:
- C++一个线程如何正确通信其任务已完成?
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 线程之间的通信不起作用 - C++
- 关于套接字通信的线程
- ZeroMQ:如何使用inproc减少多线程通信延迟
- 用于线程间通信的 Windows 套接字
- 与处理 ZeroMQ 的永久线程与 Qt 通信
- 与非主线程的 GUI 线程通信
- 使用 C++14 和 GLib (GDBus) 的线程通信
- 使用Protobuf进行线程通信
- C 14中的乘数交叉线程通信
- 使用PTHREDS与C 进行线程通信
- Qt中的多线程通信
- 与OpenSSL的多线程通信
- Qt多线程通信
- std::线程通信问题
- Boost:是否存在用于仅线程通信的进程间消息队列机制
- 工作线程如何与主 UI 线程通信
- libuv线程通信
- c++是否有一种方法可以有效地与线程通信而不中断他的工作