多个线程调用一个连接好的socket进行send需要lock吗?

hwbox 2010-07-16 01:35:28
如题
多个线程调用一个连接好的socket进行send需要lock吗?
...全文
988 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
满衣兄 2010-07-20
  • 打赏
  • 举报
回复
一般都是多个工作线程把需要发送的数据写到一个加锁的缓冲区中,然后另外一个线程单独进行发送。多个线程直接写一个socket还真没这么做过。
hwbox 2010-07-20
  • 打赏
  • 举报
回复
谢谢,结贴给分。
满衣兄 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hwbox 的回复:]
是的我的程序就是这样的,两个发送线程之间没有任何关系,我只关心一点,就是当大家共用_Socket的时候

_Socket.Send(byte_send);

这句要不要加锁控制一下,发送线程中的byte_send不是共用的。也就是说两个线程同时用_Socket Send的时候,_Socket会不会自己处理同步的问题。
[/Quote]
上面说的很清楚了,不炫耀给socket加锁,它自己会处理的。
Send函数在发送的时候,首先会对缓存加锁.通过加锁确保多个进程按序互斥访问插口缓存.(tcp/ip 卷2, page 394,395)
也就是说其实系统已经帮我们做好这些了.
hwbox 2010-07-20
  • 打赏
  • 举报
回复
是的我的程序就是这样的,两个发送线程之间没有任何关系,我只关心一点,就是当大家共用_Socket的时候

_Socket.Send(byte_send);

这句要不要加锁控制一下,发送线程中的byte_send不是共用的。也就是说两个线程同时用_Socket Send的时候,_Socket会不会自己处理同步的问题。
满衣兄 2010-07-20
  • 打赏
  • 举报
回复
你举的这个例子的确不需要加锁,你程序里不会也是这么写的吧?如果是这么写的就不要加锁了。我的意思是如果besend 是类成员变量只要对besend 加锁就行了
hwbox 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yfqvip 的回复:]
{
for(int i=1;i<10000;i++)
{
lock();
string besend = "aaaaa";
byte[] byte_send = Encoding.UTF8.GetBytes(besend);
unlock();
_Socket.Send(byte_send);

}
}
[/Quote]

不明白,你加锁控制的都是我的线程内部变量,没有任何意义啊?
满衣兄 2010-07-20
  • 打赏
  • 举报
回复
{
for(int i=1;i<10000;i++)
{
lock();
string besend = "aaaaa";
byte[] byte_send = Encoding.UTF8.GetBytes(besend);
unlock();
_Socket.Send(byte_send);

}
}
hwbox 2010-07-20
  • 打赏
  • 举报
回复
我用代码说明一下,我现在有一个接收线程,二个发送线程。应当怎么加锁?

接收线程一
{
byte[] byte_Receive = new byte[4096];
while (true)
{
int byte_Receive_No = _Socket.Receive(byte_Receive, byte_Receive.Length, SocketFlags.None);

string theGetString = Encoding.UTF8.GetString(byte_Receive, 0, byte_Receive_No);
//其它的一些处理
}

}

发送线程1
{
for(int i=1;i<10000;i++)
{
string besend = "aaaaa";
byte[] byte_send = Encoding.UTF8.GetBytes(besend);
_Socket.Send(byte_send);
}
}

发送线程2

{
for(int i=1;i<10000;i++)
{
string besend = "aaaaa";
byte[] byte_send = Encoding.UTF8.GetBytes(besend);
_Socket.Send(byte_send);
}
}
ztenv 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hwbox 的回复:]
引用 7 楼 zjx198934 的回复:
操作接收和发送都时候都lock


接收和发送都要lock?接收的时候是阻塞模式的啊,要lock了不就发不了了?
tcp/ip不是全双工的么?
[/Quote]
正如楼上所讲,不要lock(socket的实例),这样是不对的,lock的是socket发送的缓冲区,因为有多个线程往缓区写数据,
满衣兄 2010-07-20
  • 打赏
  • 举报
回复
socket是不需要加锁的,你这种情况只要对socket接收到的数据加锁就行了。你说的这种情况比较像完成端口模型,如果有兴趣可以参考此模型。
hwbox 2010-07-20
  • 打赏
  • 举报
回复
顶起,求详细解答
hwbox 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zjx198934 的回复:]
操作接收和发送都时候都lock
[/Quote]

接收和发送都要lock?接收的时候是阻塞模式的啊,要lock了不就发不了了?
tcp/ip不是全双工的么?
zjx198934 2010-07-19
  • 打赏
  • 举报
回复
操作接收和发送都时候都lock
zhoubupt 2010-07-19
  • 打赏
  • 举报
回复
学习线程
hwbox 2010-07-19
  • 打赏
  • 举报
回复
那么同一个socket,如果有一个线程接收,两个线程发送(或者是在接收线程中用异步的方式调用了某个方法中有发送的操作)。此时,我是否要人为的在发送的时候进行lock呢。如果要lock的话,既然tcp/id是全双工的,是不是只要针对send方法lock某个标志就可以?
ztenv 2010-07-16
  • 打赏
  • 举报
回复
发送的时候lock
hwbox 2010-07-16
  • 打赏
  • 举报
回复
是各开一个发送缓冲区,各发各的就行,还是必须用一个共享的发送缓冲区?
hwbox 2010-07-16
  • 打赏
  • 举报
回复
我的客户端和服务器端建立了连接socket1,这个连接是个全局的。开了一个线程处理接收(不发),在这里有一个接收的缓冲区buff1。另有两个线程想用这个socket1发送字符串,应当怎么弄?
showjancn 2010-07-16
  • 打赏
  • 举报
回复
一般不要。
不过你能不能说具体点。
lock用于互斥。
除非你发送时用的缓冲区是共享的。

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧