簡體   English   中英

寫入套接字的多線程

[英]Multiple Threads Writing to a Socket

我創建了一個TCP客戶端應用程序,並決定使用c中的pthread庫使用新線程處理傳入數據。

但是,我在某處讀到,當多個線程嘗試為套接字連接寫入同一文件描述符時,可能會發生意外情況。

確保這些“意外事件”不會發生的最佳方法是什么?

首先甚至需要使用線程嗎?

注意:我決定使用線程是為了防止任何阻塞操作。

為了避免阻塞,您應該研究異步操作。 您可以了解特定平台的處理方式,也可以使用諸如ASIO( https://think-async.com/ )的庫來為您處理。

我可能建議使用libuv嗎? 它是高度維護的(node.js的核心)和跨平台。

另外,您不應使用過時的select() 如果您自己進行操作,則應在Linux上使用epoll() 它擴展好得多

您只能有一個編寫線程。 當套接字不忙時,該線程應寫入。

Checkuv libuv-它可以為您處理所有這些混亂情況,但仍使您與金屬保持緊密聯系。 https://nikhilm.github.io/uvbook/networking.html

我對這類事情的處理方法通常是擁有一個寫程序線程和一個快速的讀者回調,通常只是為傳入的數據分配內存,然后僅將其委派給1個或多個處理線程。 如果要快速實現,請不惜一切代價避免使用memcpy ,並分配一個較大的緩沖區作為開始。

  • 是的,如果要在等待傳入的TCP數據時執行其他任何操作,則需要創建線程

  • 是的,您需要照顧多線程程序中可能發生的意外情況

您應該使用互斥體來防止所謂的意外情況。 您用於創建線程的pthread庫還包含同步原語。

一個示例程序可能看起來像這樣

pthread_mutex_t tcp_lock;

void ThreadFunction()
{
        pthread_mutex_lock(&tcp_lock);
        // Do your stuffs 
        pthread_mutex_unlock(&tcp_lock);
}

int MainThread()
{
    pthread_mutex_lock(&tcp_lock);
    // Do your stuffs
    pthread_mutex_unlock(&tcp_lock);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM