多个线程写入插座

Multiple Threads Writing to a Socket

本文关键字:插座 线程      更新时间:2023-10-16

我创建了一个TCP客户端应用程序,并决定使用c。

中的pthread库处理传入数据。

但是,我在某个地方读到,当多个线程尝试写入插座连接的同一文件描述符时,可能会发生意外的事情。

确保这些"意外事情"不会发生的最佳方法是什么。

甚至需要首先使用线程吗?

nb:我决定使用线程的决定是防止任何阻止操作。

要避免阻塞,您应该研究异步操作。您可以了解您的特别平台如何处理它们,也可以使用库,例如ASIO(https://think-async.com/),它将为您处理。

我可能建议使用libuv吗?它是高度维护的(node.js的核心)和跨平台。

另外,您不应使用旧学校的select()。如果您自己这样做,则应在Linux上使用epoll()。它可以更好地缩放

您只有一个作家线程。该线程在插座不忙时应写入。

结帐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);
}