新鲜出炉的bug--dll,socket,线程同步

bug1:dll关闭之后销毁了建立的socket

client端--》创建socket在一个dll里面,然后并没有注意到代码(第三方代码,看了源码才注意到)有一个地方在按下一个按钮后调用了FreeLibrary把动态链接库给释放了,那么在动态链接库里面建立的socket同样被释放了,所以在服务端一直阻塞在了recv这个函数。

bug2:bug1之后,我们在客户端重新创建socket,服务端也重新创建socket,但是由于线程同步问题(因为我们一个线程专门接收数据,一个线程处理数据以及做其他动作),在接收线程调用recv函数之后(由于客户端还没有发送东西过来,所以阻塞在了recv)才重新创建的socket,然而这个时候recv函数还在接收以前的那个socket的数据,肯定会接收不到啊!!

我更改了一下同步的代码,建立了两个事件量(windows里面的事件对象同步),初始化的时候让接收的事件量recv_event为non_signaled,处理的事件量pro_event为signaled.然后在接收线程用WaitForSingleObject等待pro_event,处理线程里面用WaitForSingleObject等待recv_event,刚开始由于pro_event为signaled所以可以先进入接收线程,接收线程完了之后SetEvent(recv_Event),触发处理线程往下执行,处理线程执行完之后SetEvent(pro_Event),触发接收线程往下执行,这样就保证了按照我们预期执行,而且可以在处理线程重新建立socket连接之后,再触发接收线程运行recv函数,这样就解决了bug2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值