Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多线程发送的Linux套接字_Linux_Sockets_Pthreads - Fatal编程技术网

使用多线程发送的Linux套接字

使用多线程发送的Linux套接字,linux,sockets,pthreads,Linux,Sockets,Pthreads,我有一个非阻塞套接字向多个目标发送udp数据包,并在同一个套接字上接收来自所有目标的响应。我在一个专用线程中阅读,但是写入(sendto)可以来自几个不同的线程 没有任何额外的同步,这是安全的吗?我是否需要在持有互斥锁时进行写入?或者,写入是否需要来自同一个线程,而我需要一个队列?您可以从单个或多个线程写入套接字。如果您从多个线程写入套接字,它们应该与互斥锁同步。如果您的线程将其消息放在队列中,并且有一个线程从队列中抽出来执行写操作,那么对队列的读写操作应该受到互斥锁的保护 从不同线程读取和写入

我有一个非阻塞套接字向多个目标发送udp数据包,并在同一个套接字上接收来自所有目标的响应。我在一个专用线程中阅读,但是写入(sendto)可以来自几个不同的线程


没有任何额外的同步,这是安全的吗?我是否需要在持有互斥锁时进行写入?或者,写入是否需要来自同一个线程,而我需要一个队列?

您可以从单个或多个线程写入套接字。如果您从多个线程写入套接字,它们应该与互斥锁同步。如果您的线程将其消息放在队列中,并且有一个线程从队列中抽出来执行写操作,那么对队列的读写操作应该受到互斥锁的保护


从不同线程读取和写入同一套接字不会相互干扰。

内核将为您同步对底层文件描述符的访问,因此您不需要单独的互斥。如果使用TCP,这种方法可能会有问题,但因为我们讨论的是UDP,所以应该是安全的,虽然不一定是最好的方式。

互斥锁确实会序列化请求,但不同之处在于写入将来自不同的线程,而不是来自具有生产者/消费者样式队列的同一线程。可能重复:这里还讨论了以下主题:@Casper Good link to googlegroups@Nicolai在这个应用程序中有几个工作线程“感知”发送数据包的需要。好奇您的评论,这不一定是最好的方式--原因是什么?这完全取决于手头的应用程序,但一般来说,udp服务器使用非阻塞套接字以迭代方式更容易、更干净。@NY UPTOWN:可以让来自不同线程的多个
sendto()
,但是您应该确保
sendto()
不会与
close()
@caf竞争,因为这是关于close的好观点。逻辑是一些线程在初始化时启动,然后(使用条件变量)在关闭之前停止并连接。