posix C write()与线程安全

posix C write()与线程安全,c,thread-safety,posix,C,Thread Safety,Posix,有一种方法可以序列化Cwrite(),这样我就可以在套接字上写入字节,在k线程之间共享,而不会丢失数据?我认为这个问题的解决方案包括用户空间锁定,那么可伸缩性呢?提前感谢您。因为POSIX似乎没有在发送(2)时指定原子性保证,所以您可能必须使用互斥。当然,这种序列化会使可伸缩性付诸东流。一种可能的方法是使用锁定机制。在套接字上写入任何内容之前,每个线程都应该等待一个锁,一旦完成,就应该释放锁。 如果所有线程都发送完全相同类型的消息,那么接收方在读取数据时不会有任何问题,但是如果不同的线程可以发送

有一种方法可以序列化
C
write()
,这样我就可以在套接字上写入字节,在k线程之间共享,而不会丢失数据?我认为这个问题的解决方案包括用户空间锁定,那么可伸缩性呢?提前感谢您。

因为POSIX似乎没有在发送(2)时指定原子性保证,所以您可能必须使用互斥。当然,这种序列化会使可伸缩性付诸东流。

一种可能的方法是使用锁定机制。在套接字上写入任何内容之前,每个线程都应该等待一个锁,一旦完成,就应该释放锁。 如果所有线程都发送完全相同类型的消息,那么接收方在读取数据时不会有任何问题,但是如果不同的线程可以发送具有可能不同信息的不同类型的数据,那么您应该具有与每种数据相关联的唯一消息id,最好也发送线程id(虽然不是必需的,但可能有助于调试小问题)

您可以有如下结构:

typedef struct my_socket_data_st
{
int msg_id;
#ifdef __debug_build__
    int thread_id;
#endif
size_t data_size_in_bytes;
.... Followed by your data ....
} my_socket_data_t

可伸缩性取决于很多因素,包括应用程序运行所依赖的硬件资源。由于它是一个网络应用程序,您还必须考虑网络带宽。虽然没有(有一些,但我认为您可以暂时忽略它们)在套接字上发送/接收数据的操作系统的限制,但您必须考虑到根据您的要求来制作<代码>发送<代码>同步或异步。此外,由于您正在使用锁,您还必须考虑锁拥塞。如果该锁对于其他线程来说不易使用,则会降低PE。r性能是一个很大的因素。

我认为正确的答案取决于线程是否需要同步等待响应。如果它们只需要将一些消息写入套接字,而不需要等待对等方响应,我认为最好的答案是使用一个线程,专门从另一个线程所在的队列中写入消息线程将消息放在队列上。这样,工作线程就可以简单地将消息放在队列上并继续执行其他操作

当然,队列必须受到互斥锁的保护,但是任何一个线程只要在操作队列时就必须持有锁(保证很短的时间)。让每个线程直接写入套接字的更明显的替代方法要求每个线程保持锁,直到写入操作完成为止。这永远比只向队列中添加项要长得多,因为写入是一个系统调用,可能会阻塞很长一段时间

即使您的线程需要对其消息进行响应,也可能需要进行类似的操作。套接字服务线程变得更加复杂,因为您必须在套接字上执行类似的读写操作,以阻止其阻塞,您还需要一种将消息与响应相匹配的方法,以及一种通知线程嗯,他们的反应已经到了