【问题标题】:Thread about socket communication关于套接字通信的线程
【发布时间】:2020-04-08 23:31:33
【问题描述】:

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

函数监听

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);

}

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

【问题讨论】:

  • 我不知道从哪里开始,这有很多问题。从第一个开始:在Listen 中,线程t 完全没有意义。调用线程阻塞,而另一个线程执行。你应该直接打电话给Recv_data

标签: c++ multithreading sockets


【解决方案1】:

您使用线程是为了允许事情在其他事情发生时继续运行,因此想要“停止main”似乎违反直觉。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多