成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

多線程客戶端可以使用一個socket嗎?怎么保證線程得到想要的數據?

開發 前端
多線程共享一個socket的場景也還是常見的。只不過多個線程同時對這個socket進行讀寫操作,可能會出現數據錯亂。也就是題目問的怎么保證線程得到想要的數據?

答案是可以,其實在項目中,多線程共享一個socket的場景也還是常見的。只不過多個線程同時對這個socket進行讀寫操作,可能會出現數據錯亂。也就是題目問的怎么保證線程得到想要的數據?

我想到的有兩種處理方法 

第一種:單線程讀/寫+消息隊列分發 

思路就是:讓一個專門的線程負責socket的讀寫,其他線程通過隊列和這個線程通信。

設計步驟: 

1、線程A專門負責讀取 socket 數據,并將數據分發到其他線程。 

2、使用消息隊列(如 std::queue )保存 socket 接收到的數據,并根據數據類型或標志位,將數據分發給需要的線程。 

3、寫操作也通過消息隊列統一到專門的線程A執行,避免沖突。

這種設計的優點:保證線程間的數據一致性,避免多線程直接讀寫 socket 的沖突。很多需要保證順序的業務也是采用這種方式。 

這種把某個業務功能放在一個線程,其他線程配合的做法,很多項目用到,例如redis,主邏輯也是單線程處理,然后也用到了很多隊列和這個主邏輯線程進行配合。

一個簡單的示例: 

#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>

std::queue<std::string> message_queue; // 消息隊列
std::mutex queue_mutex;
std::condition_variable cond_var;

void socket_reader(int socket_fd) {
    while (true) {
        char buffer[1024];
        int bytes = recv(socket_fd, buffer, sizeof(buffer), 0);
        if (bytes > 0) {
            std::string message(buffer, bytes);

            // 加入隊列
            {
                std::lock_guard<std::mutex> lock(queue_mutex);
                message_queue.push(message);
            }
            cond_var.notify_one();
        }
    }
}

void worker_thread() {
    while (true) {
        std::unique_lock<std::mutex> lock(queue_mutex);
        cond_var.wait(lock, [] { return !message_queue.empty(); });

        // 從隊列中取出消息
        std::string message = message_queue.front();
        message_queue.pop();
        lock.unlock();

        // 處理消息
        std::cout << "Worker thread received: " << message << std::endl;
    }
}

int main() {
    int socket_fd = 0; // 假設 socket_fd 已經初始化

    // 啟動讀線程和工作線程
    std::thread reader_thread(socket_reader, socket_fd);
    std::thread worker(worker_thread);

    reader_thread.join();
    worker.join();
    return 0;
}


第二種:如果多線程必須都要直接操作socket,那么第一種方式就不滿足了,這個時候就要用到鎖機制了。 

思路就是:多個線程要直接操作同一個 socket,使用互斥鎖來保證同一時刻只有一個線程訪問 socket。 

設計步驟: 

1、在讀/寫操作時加鎖,保證數據的完整性。 

2、每個線程可以根據協議中的標志或數據格式,解析出屬于自己的數據。 

這種做法效率會稍微低點,因為鎖的粒度相當于放大了。更重要的是耦合性也增加了,而第一種方案耦合性很低,讀寫線程就只管讀寫,其他線程負責處理數據。

簡單示例: 

#include <iostream>
#include <thread>
#include <mutex>

std::mutex socket_mutex;

void read_from_socket(int socket_fd, int thread_id) {
    std::lock_guard<std::mutex> lock(socket_mutex);

    char buffer[1024];
    int bytes = recv(socket_fd, buffer, sizeof(buffer), 0);
    if (bytes > 0) {
        std::string data(buffer, bytes);
        std::cout << "Thread " << thread_id << " received: " << data << std::endl;
    }
}

void write_to_socket(int socket_fd, const std::string& message) {
    std::lock_guard<std::mutex> lock(socket_mutex);
    send(socket_fd, message.c_str(), message.size(), 0);
}

int main() {
    int socket_fd = 0; // 假設 socket_fd 已經初始化

    std::thread t1(read_from_socket, socket_fd, 1);
    std::thread t2(read_from_socket, socket_fd, 2);

    t1.join();
    t2.join();
    return 0;}


暫時只想到這兩種方案,如果你有更好的方案,歡迎在評論區提出。

總結:

如果需要高性能和數據一致性,使用單線程讀/寫 + 消息隊列分發。

如果場景簡單,可以通過互斥鎖直接控制多線程訪問。

責任編輯:武曉燕 來源: CppPlayer
相關推薦

2010-03-17 18:04:55

java Socket

2011-12-15 11:03:21

JavaNIO

2009-06-08 20:16:15

Eclipse客戶端多線程

2022-03-14 09:35:43

Pythonhttpx

2019-02-25 14:54:37

開源播客客戶端gPodder

2025-01-26 09:35:45

2019-07-22 20:03:23

Docker操作系統Linux

2010-03-18 16:49:43

Java Socket

2020-02-25 09:45:05

Dino開源XMPP

2021-11-29 07:47:57

gRPCGUI客戶端

2016-10-09 08:35:09

Linux桌面REST

2017-07-24 10:18:55

LinuxNylas Mail郵件客戶端

2011-08-17 10:10:59

2021-09-11 15:26:23

Java多線程線程池

2012-12-07 10:15:53

IBMdW

2022-06-13 07:33:57

socketReact組件

2024-02-01 14:59:14

多線程硬件系統

2011-03-21 14:53:36

Nagios監控Linux

2011-04-06 14:24:20

Nagios監控Linux

2020-10-26 13:12:00

多線程調度隨機性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄网免费看 | 日本不卡免费新一二三区 | 欧美成年黄网站色视频 | aacc678成免费人电影网站 | 天天天操 | 成人精品一区二区三区 | 久久久久久久久久久久久久久久久久久久 | 中文字幕在线视频免费视频 | 毛片免费看| 国产视频二区 | 自拍视频精品 | 亚洲综合激情 | 日韩免费激情视频 | 成人亚洲网站 | 中文字幕成人在线 | 免费视频99 | 国产97在线 | 日韩 | 日韩午夜精品 | 美女福利视频一区 | 成人a在线 | 91精品中文字幕一区二区三区 | 欧美成人精品二区三区99精品 | 狠狠做深爱婷婷综合一区 | 国产精品成人一区二区三区吃奶 | 99免费精品| 国产精品乱码一区二三区小蝌蚪 | 国产欧美日韩在线观看 | 国产视频福利在线观看 | 久久国产精品-国产精品 | 亚洲精品乱码久久久久久9色 | 国产一区2区 | 福利视频网 | 伊人精品一区二区三区 | 91aiai| 日韩一区二区三区av | 日韩在线不卡 | 久精品久久 | 国产在线一区二区 | 国产欧美精品一区二区三区 | 亚洲欧美视频一区二区 | 日韩中文字幕视频在线观看 |