我创建的一个数据报套接字,绝大多数时间处于recvfrom状态(阻塞),只有收到数据后才将数据处理并sendto给对方,如果正在sendto时,我还能不能再sendto?也就是说需要互斥访问套接字吗?

解决方案 »

  1.   

    使用重叠的i/o模型要使用WSASendTO
      

  2.   

    我的UDP服务就是一个IOCP服务,有两个工作线程,我担心两个线程同时WSASendTo
      

  3.   

    当然了,一个cpu同时只能干一件事情,即使是并行 的程序也是有os分配时间片来做的!不过,用重叠io或完成端口,可以把消息放入消息队列中,防止消息丢失!否则会抛弃同时发生的sendto 消息。
      

  4.   

    听了大家的意见,也就是说在操作sendto时还是应该使用临界区进行互斥访问,是吧?
      

  5.   

    如果你自己处理,不利用已经有的机制,你可以用临界区;否则可以用类似WSASend之类的函数把具体如何同步的问题发给系统处理。
      

  6.   

    你发出两个异步的SendTo当然最终会完成两个发送动作。
    动作完成后会从IOCP的队列得到消息。
      

  7.   

    我程序里是这样的:
    开了两个工作线程,
    首先投递一个WSASendTo,一旦GetQueuedCompletionStatus触发,立即保存信息,再投递WSASendTo,然后才处理刚才获得的信息,处理完毕后使用sendto返回客户,我担心的是两个线程里如果同时执行到sendto该咋办,因为是UDP,两个线程都是使用同一个套接字。
      

  8.   

    两个线程都有可能在GetQueuedCompletionStatus的地方阻塞,如果第一个SendTo完成时,只有其中的一个线程在GetQueuedCompletionStatus中得到消息。完成动作的消息是唯一的,所以无论多少个线程,对于每个在IOCP队列中的消息来说通过GetQueuedCompletionStatus得到的消息,在任一时刻只会由其中的一个线程获得。
      

  9.   

    GetQueuedCompletionStatus完成后,如果有同时sendto发生,那你可以使用互斥访问。