Winsocks的原子性保证?

时间:2010-05-03 17:09:56

标签: winsock atomicity

由于Windows不提供UNIX域套接字,我使用本地TCP连接来模拟行为。现在,POSIX保证如果多个线程并行写入UNIX域套接字,则将以原子方式处理最多为PIPE_BUF的块 - 即不会发生交错。在本地TCP winsock上是否有类似的保证,或者我是否必须使用临界区同步编写器?

2 个答案:

答案 0 :(得分:1)

如果有多个线程写入同一个套接字,那么每个写入调用都将是原子的,但每个写入调用相对于在不同线程上发生的其他写入调用进行交错;

所以,如果你有线程1在一次写入中写一个A字符串,而线程2用一次写入写一系列B,用另一次写入一系列C,那么你可能得到ABC,或者BAC或BCA但是你不会得到一个A的破坏,中间有一些B ......

如果您要求线程2发出的两个写入不与线程1发出的写入交错(即ABC和BCA没有问题,但BAC不是),那么您应该使用一个调用在线程2中使用WSABUF结构数组中的两个缓冲区(散布/聚集写入)中的WSASend(),或者您需要锁定写入调用,以便线程1不会中断。

答案 1 :(得分:0)

没有明确保证。锁。除非你处于极其紧凑的循环中,否则无法使用的锁很便宜。如果你真的不想这样做,请使用重叠的i / o。