社区
C#
帖子详情
多个线程调用一个连接好的socket进行send需要lock吗?
hwbox
2010-07-16 01:35:28
如题
多个线程调用一个连接好的socket进行send需要lock吗?
...全文
988
19
打赏
收藏
多个线程调用一个连接好的socket进行send需要lock吗?
如题 多个线程调用一个连接好的socket进行send需要lock吗?
复制链接
扫一扫
分享
转发到动态
举报
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用于互斥。
除非你发送时用的缓冲区是共享的。
Google Android SDK开发范例大全(PDF高清完整版3)(4-3)
3.9
调用
另
一个
Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前
一个
Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 ...
Google Android SDK开发范例大全(PDF完整版4)(4-4)
3.9
调用
另
一个
Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前
一个
Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 ...
Google Android SDK开发范例大全(PDF高清完整版1)(4-1)
3.9
调用
另
一个
Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前
一个
Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 ...
多
线程
中对同一
socket
调用
send
/
send
to
群里问多
线程
环境中对
一个
socket
进行
send
可以不可以; 答: 这个问题不是多
线程
问题 , 是TCP / UDP 的问题; 如果是tcp ,这是个错误的设计,如果你无视数据顺序,那可以 ;如果是udp可以; TCP: 在win32上,我没有...
请教:多
线程
同时写
socket
是否
需要
加锁
第一种可以,因为
Socket
是双工的 多
线程
读写同一
Socket
的话基本上是会出问题的 想要不出问题的话,除非你的
多个
线程
作用是一样的 在TCP/TP卷2中有这样的结构体 struct sockbuf{ short ...
C#
111,112
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章