多个线程写入插座
Multiple Threads Writing to a Socket
我创建了一个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);
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 多个线程写入插座
- C 线程采用插座参数
- 线程中带有TCP插座的奇怪行为
- 增强异步插座和Boost ::线程