我创建了一个TCP客户端应用程序,并决定使用c中的pthread库使用新线程处理传入数据。
但是,我在某处读到,当多个线程尝试写入套接字连接的同一文件描述符时,可能会发生意外情况。
确保这些意想不到的事情的最佳方法是什么?'不会发生。
首先是否需要使用线程?
注意:我决定使用线程是为了防止任何阻塞操作。
答案 0 :(得分:1)
为了避免阻塞,您应该研究异步操作。您可以了解特定平台如何处理它们,或者使用一个库,例如ASIO(https://think-async.com/),它将为您处理它。
答案 1 :(得分:0)
我可以推荐使用libuv吗?它是高度维护的(node.js的核心)和跨平台。
此外,您不应该使用select()
这所旧学校。如果您自己动手,则应在Linux上使用epoll()
。它可以更好地扩展很多。
你应该只有一个编写器线程。当套接字不忙时,该线程应该写入。
Checkout libuv - 它为你处理所有这些混乱,但仍然让你接近金属。 https://nikhilm.github.io/uvbook/networking.html
我对这类东西的处理方法通常是有一个编写器线程和一个快速读取器回调,通常只为传入数据分配内存,然后只委托给一个或多个处理线程。如果你想要它不惜一切代价快速避免memcpy
,并分配一个大的缓冲区来开始。
答案 2 :(得分:-2)
是的,如果你想在等待传入的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);
}