问答

c++ winsock2线程安全吗?

 来源    2018-10-07    1  

我正在写一个小型3服务器和1个客户端程序. 2个服务器发送tcp消息,最后一个使用winsock2发送upd数据报.

我想知道我是否可以通过使用线程(OpenMP或boost :: threads)来模拟recvfrom(),以便2个线程同时从同一端口上的同一个套接字进行侦听.

我在windows7上使用VC 2010.

感谢您的帮助.

是的,套接字是线程安全的,但是你必须要小心.一种常见模式(使用阻塞IO时)是让一个线程在套接字上接收数据,另一个线程在同一个套接字上发送数据.让多个线程从套接字接收数据通常适用于UDP套接字,但对大多数时候TCP套接字没有多大意义. WSARecv的文档中有警告:

WSARecv should not be called on the same socket simultaneously from
different threads, because it can result in an unpredictable buffer
order.

但是,如果使用UDP并且协议是无状态的,这通常不会引起任何问题.

另请注意,WSAEINPROGRESS错误代码主要适用于Winsock 1.1:

WSAEINPROGRESS: A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.

WSAEINPROGRESS的描述进一步说明:

Operation now in progress.

A blocking operation is currently executing. Windows Sockets only allows a single blocking operation—per- task or thread—to be outstanding, and if any other function call is made (whether or not it references that or any other socket) the function fails with the WSAEINPROGRESS error.

请注意,这涉及每个任务或线程的单个阻塞操作.

此外,WSARecv的文档中还有一个警告:

Issuing another blocking Winsock call inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.

但除了那些警告你应该没事.

更新:添加一些外部引用:
alt.winsock.programming: Is socket thread-safe?
Winsock Programmer’s FAQ: Is Winsock thread-safe?

相关文章
如何从另一个线程取消发出http请求的线程
问答关于我们如何杀死已发出http post请求并等待获得响应的线程的任何建议.我希望从另一个并行运行的线程中杀死这个线程,然后才能收到请求的任何响应.我建议关闭或中止http post请求但没有锻炼,有 ...
1
Linux中进程/线程的大小
问答Linux中进程/线程的大小是多少?创建进程/线程时,还有task_struct和其中的其他数据结构,还有什么吗? 进程/线程初始化(固定大小)时是否分配了进程/线程的堆栈?或者在必要时分配(如虚拟内 ...
1
ios – 如何在继续使用segue之前等待另一个线程完成?
问答我有两个UITableViewControllers,我在它们之间使用故事板进行区分. 在prepareForSegue:sender:中,第一个VC从Web服务获取NSArray,并使用下载的数据设 ...
1
java – 为什么主线程在继续之前等待另一个线程完成?
问答我在一个复杂的Java应用程序中遇到的问题可归结为以下几点:主线程在子线程未完成之前不会继续,尽管我认为应该这样做.示例问题的代码如下所示: public class ThreadTest { sta ...
1
c# – 如何在继续之前等待线程完成?
问答我有一些代码用于在.NET CF 2.0上启动一个线程: ThreadStart tStart = new ThreadStart(MyMethod); Thread t = new Thread(t ...
Perl多线程:跨平台脚本中的”forks”与”线程”
问答我正在尝试开发一种具有多线程功能的软件. 在Linux上,脚本运行正常,我使用的模块是"forks". 换句话说,在查询db和类似的东西时,线程之间没有共享处理程序的问题. 一旦我 ...
多线程 – 从两个线程同时读取文件描述符
问答>我的问题:在Linux(以及FreeBsd中,通常在UNIX中)是否可以同时从两个线程读取单个文件描述符? >我做了一些搜索但没有发现任何东西,虽然很多人问同时关于从/向套接字fd读/写 ...
3
c# – 所有线程完成后设置属性值?
问答在我的应用程序中有三个线程,如: private Thread _analysisThread; private Thread _head2HeadThread; private Thread _fo ...
c# – 为什么在具有STAThreadAttribute的线程上不支持WaitAll方法?
问答This msdn article州: The WaitAll method is not supported on threads that have STAThreadAttribute. 如果谷 ...
1
多线程 – 在Delphi线程之间共享Native变量
问答我假设如果线程之间的共享变量具有本机类型,则原子性应该完成工作. 但是根据下面代码的输出,情况并非如此,至少对于delphi而言. 线程t1只是将计数器递增10M次. 同时,线程t2将计数器递减10M ...
1
java – 利用线程实现kruskal的算法
问答我正在实现Kruskal的算法,我想利用线程.但是我不确定我对算法有足够的了解. 我想象的是,我会在最后解决并连接图表的不同部分.谁能指出我正确的方向?谢谢.::从Wikipedia起 Researc ...
cuda – 使用主机线程同步设备内存访问
问答CUDA内核是否有可能在没有任何主机端调用的情况下(例如,cudaDeviceSynchronize)将写入同步到设备映射的内存?当我运行以下程序时,似乎内核在终止之前等待对设备映射内存的写入完成,因 ...
1
java – ExecutorService,如何知道所有线程何时完成而不阻塞主线程?
问答我有一个多线程实现,我创建一个ExecutorService并提交要执行的任务,我想知道所有线程被提交的时间已经完成而没有阻塞主线程和UI.我已经尝试过ExecutorService.awaitTer ...
1
java – 如何等待所有线程完成,使用ExecutorService?
问答我需要一次执行一些任务4,这样的东西: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { tas ...
1
java – 如何在完成所有线程后执行一段代码
问答我有一个日志代码,需要在执行所有Threadss后执行. Thread t1 = new MyThread(); Thread t2 = new MyThread(); t1.run(); t2.ru ...
2
java – ExecutorService的shutdown()不会等到所有线程都完成
问答我有一个代码,其中4个线程同时运行.我想等到所有这4个线程都完成.只有在那之后继续app流程. 我尝试了两种方法: > Thread#join(),这种方法按预期工作. join()之后的代码仅 ...
1
java – 如何通知ExecutorService完成任务的调用者线程
问答从主线程: executorService.submit(new Runnable() { ... }); 现在,当Runnable完成执行时,是否有Java的标准方式来通知调用程序线程它已经完成执行 ...
python – 如何阻止主线程,直到所有其他线程完成执行?
问答这是一个新手问题.我从主线程开始10个线程.如何阻止主线程继续,直到所有其他线程完成?::Join所有主题: for t in threads: t.join() 这里的线程是你的线程列表.
如何暂停/恢复Java中ExecutorService中的所有线程?
问答我向Java的执行人员提交了一些工作,我以某种方式暂时暂停所有这些工作.最好的方式是做什么?如何恢复?还是我这样做完全错了?我应该遵循我想实现的其他模式(即暂停/恢复执行服务的能力)?::为了回答自己 ...
1