首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Linux C/C++套接字发送多线程代码

Linux C/C++套接字发送多线程代码
EN

Stack Overflow用户
提问于 2011-10-30 08:30:07
回答 1查看 7.5K关注 0票数 9

在多线程代码中,如果有多个线程试图同时向tcp套接字发送数据,会发生什么情况?它们的数据会是混合的,还是不同的线程会一个接一个地发送数据?

EN

回答 1

Stack Overflow用户

发布于 2017-05-18 02:41:43

实际上,正如前面的回答所说:“最安全的机制是只有一个线程向套接字提交数据。”

但是如果你想让多个线程调用读/写,你必须自己保证线程的安全性。我已经在下面的send和recv周围写了一个包装器,它可以为你做这件事。

Send()和Recv()是线程安全的,因为它们不会导致崩溃,但不能保证这些数据不会与从其他线程发送的数据“混合”。因为我们很可能不想这样,所以我们必须阻塞,直到所有线程的数据都被确认发送或接收,或者出错。如此长的阻塞调用可能会有问题,因此请确保您是在可以处理长阻塞操作的线程上执行此操作。

对于linux:

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/socket.h>
#include <map>
#include <mutex>



/* blocks until the full amount of bytes requested are read
 * thread safe
 * throws exception on error */
void recv_bytes(int sock, char* buf, int len, int flags){

    static std::map<int, std::mutex> mtx;

    std::lock_guard<std::mutex> lock(mtx[sock]);

    int bytes_received = 0;

    while (bytes_received != len){

        int bytes = recv(sock, buf + bytes_received, len - bytes_received, flags);

        //error check
        if (bytes == -1){
            throw std::runtime_error("Network Exception");
        }

        bytes_received += bytes;

    } 
}



/* blocks until the full amount of bytes requested are sent
 * thread safe
 * throws exception on error */
void send_bytes(int sock, char* buf, int len, int flags){

    static std::map<int, std::mutex> mtx;

    std::lock_guard<std::mutex> lock(mtx[sock]);

    int bytes_sent = 0; 

    while (bytes_sent != len){

        int bytes_s0 = send(sock, buf, len, flags);

        if (bytes_sent == -1) {
            throw std::runtime_error("Network Exception");
        }

        bytes_sent += bytes_s0;

    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7942595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档