【发布时间】:2009-05-18 08:58:03
【问题描述】:
我正在维护一个现有系统,其中以前的开发人员对每个操作都在套接字上执行,需要多个线程来读取和写入,以前的开发人员已经在控制和互斥锁下执行了 io 操作。是否需要相互排除 C 套接字 IO 操作?或者由于套接字是全双工的,使用互斥体是多余的?只有一个线程
毫无疑问,线程将对象放入的处理队列是共享内存,必须注意相互排斥它。
【问题讨论】:
标签: c tcp mutual-exclusion
我正在维护一个现有系统,其中以前的开发人员对每个操作都在套接字上执行,需要多个线程来读取和写入,以前的开发人员已经在控制和互斥锁下执行了 io 操作。是否需要相互排除 C 套接字 IO 操作?或者由于套接字是全双工的,使用互斥体是多余的?只有一个线程
毫无疑问,线程将对象放入的处理队列是共享内存,必须注意相互排斥它。
【问题讨论】:
标签: c tcp mutual-exclusion
默认情况下,套接字不是线程安全的。因此,如果您有多个线程读取和写入它们,您将需要以某种方式锁定访问(例如使用互斥锁)。
【讨论】:
在 TCP (AF_INET, SOCK_STREAM) 的情况下,可以有一个不同步的读取线程 (recv) 和写入线程 (send)。
但是根据您的描述,不清楚在您的代码中使用互斥锁的目的是什么 - 看起来“以前的开发人员”同步网络操作不是因为套接字,而是由于您的应用程序协议的要求。 许多应用程序以这种方式执行通信:
lock
-> send request
<- recv reply
unlock
lock
-> send request
<- recv reply
unlock
这里需要锁定(如果涉及多个线程)以同步发送/接收对,否则您的应用程序协议可能会变成一堆不匹配的请求和回复。
【讨论】: