专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++ Builder

关于TClientSocket多线程使用时,需要加锁吗?解决办法

发布时间:2011-06-28 14:04:42 文章来源:www.iduyao.cn 采编人员:星星草
关于TClientSocket多线程使用时,需要加锁吗?

请在在主线程中有个TClientSocket,使用的是非阻塞模式工作。在ClientSocketRead事件中,获得服务器发来的数据,

解析并保存在队列中。另外一个线程处理队列中的数据。处理完后,需要用Socket->SendBuf方法发送(写)数据到服务端。

请问各位,在这两个线程中主线程读(接收),另外子写(发送)。这样操作,需不需要加个 临界区之类的锁。把Socket操作

时,要分别锁起来? 谢谢。

官方文档里有句话:

Use a non-blocking socket when the socket needs to synchronize reading and writing with server sockets. 

不知道如何正确理解?


------解决方案--------------------
非阻塞情况下这个必须要枷锁,因为你接受线程和发送线程是对同一个队列里的数据进行处理,存在资源竞争,需要枷锁进行保护,防止队列中的数据被改写
------解决方案--------------------
探讨

请问 Socket->Lock()和Socket->Unlock()是不是工作在当ClientSocket工作在非阻塞模式的时候?

是不是对所有Socket操作的时候,如Socket->Sendbuf 和 Socket->ReceiveBuf 的时候要加上锁?

------解决方案--------------------
这个帖子时间这么长了。这个在阻塞模式是,不用加锁。只是要自己处理接收和发送的数据,由于是一对多,所以都是用多线程,就是每个客户端连接对应一个服务端的处理线程。具体
C/C++ code
void __fastcall TServerFrm::ServerSocket1GetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
    SocketThread=new MyServer(false,ClientSocket,600000);
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: