C# Tcp/Ip通讯 多线程中信号量怎么使用?

时间:2021-05-26 15:16:51
1、多线程中的同步是否如代码中所示,或有更好的例程?
2、AutoResetEvent,Semaphore 或别的什么,哪个更合适?
3、在多个客户端下,收发一一对应,如果是多个客户端的情况,如下在发的线程中实例化信号量,收线程如何找到对应的信号量并给发线程信号?

我对多线程及同步都是刚刚接触,望大侠给予帮助,不胜感激!

公共数据

private string ssss;        //收线程收到的数据
private Boolean bWaitMark;  //信号量消息的标识
static Semaphore sem;       //程序中用的是它 
private AutoResetEvent autoResetEvent;   //程序中已注释


发送线程执行部分

//发送线程执行的内容
private void sendthread()
{                           
    //autoResetEvent = new AutoResetEvent(false);

    //创建一个可授权1个许可证的信号量,且初始值为0
    sem = new Semaphore(0, 1);

    //.......
    //发送指令
    //.......  
    
    bWaitMark = true;
    //if (autoResetEvent.WaitOne(200, false))
    if (sem.WaitOne(200, true)) // 等待接收线程消息 200毫秒超时时间
    {
        //校验应答数据 ssss                      
    }
    else 
    {
        //超时记录
    }
    sem.Close();           
}



接收线程执行部分

//接收线程执行的内容
void RecMsg(object sokConnectionparn)
{
    Socket sokClient = sokConnectionparn as Socket;            
    while (true)
    {                
        //接收数据 赋予 ssss
        
        if (bWaitMark)
        {
            //autoResetEvent.Set();
            sem.Release();
            bWaitMark = false; 
        }   
    }
}



10 个解决方案

#1


C# Tcp/Ip通讯 多线程中信号量怎么使用?

#2


C# Tcp/Ip通讯 多线程中信号量怎么使用?
大侠都在哪里啊……………………………………………………………………

#3


该回复于2013-05-18 10:42:54被管理员删除

#4


C# Tcp/Ip通讯 多线程中信号量怎么使用?不会吧……

#5


带上封包的时间吧   然后那边根据延时判断信号强弱

当然是心跳包带   别的包带  误差太大。。。

#6


引用
带上封包的时间吧   然后那边根据延时判断信号强弱

当然是心跳包带   别的包带  误差太大。。。 


可能我上面的代码并不完全,您有所误解。也可能是我提问有点不够清楚,刚接触C#对您的回复,也不太理解。
我通讯是用Socket来实现的,一个客户端与服务器连接,在服务器端产生一个客户连接对象,针对这个对象的通讯,两个线程,一收一发。收是不可控的,只要有连接对象,收就一直存在,并实时接收客户端发来的数据,发是服务器发起,发送完毕结束发送线程。这两个线程的同步,我使用了信号量。如上代码所示,单一的客户端,我可以通过公共声明信号量来实现收发线程都认识这个信号量,但是如果是多个客户端,有多对收发线程。
那收发线程中的多个信号量,怎么来确认?或者说有什么方式能让一对收发线程找到自己同步的那个信号量?
e.g:
A客户端  A收线程   A发线程    A信号量
B客户端  B收线程   B发线程    B信号量
在A发线程实例化后的A信号量,怎么让A收线程知道?并且给A发线程信号,而不是给B发线程信号?

#7


单位电脑太悲催了,引用都出不来,疯了! C# Tcp/Ip通讯 多线程中信号量怎么使用?

#8


都不清楚啊? C# Tcp/Ip通讯 多线程中信号量怎么使用?

#9


不是很清楚,个人认为如果想区分不同线程中的东东。
建议可以用字典试试,以地址为key。

#10


FlyBird 谢谢你的建议,可以试试!

#1


C# Tcp/Ip通讯 多线程中信号量怎么使用?

#2


C# Tcp/Ip通讯 多线程中信号量怎么使用?
大侠都在哪里啊……………………………………………………………………

#3


该回复于2013-05-18 10:42:54被管理员删除

#4


C# Tcp/Ip通讯 多线程中信号量怎么使用?不会吧……

#5


带上封包的时间吧   然后那边根据延时判断信号强弱

当然是心跳包带   别的包带  误差太大。。。

#6


引用
带上封包的时间吧   然后那边根据延时判断信号强弱

当然是心跳包带   别的包带  误差太大。。。 


可能我上面的代码并不完全,您有所误解。也可能是我提问有点不够清楚,刚接触C#对您的回复,也不太理解。
我通讯是用Socket来实现的,一个客户端与服务器连接,在服务器端产生一个客户连接对象,针对这个对象的通讯,两个线程,一收一发。收是不可控的,只要有连接对象,收就一直存在,并实时接收客户端发来的数据,发是服务器发起,发送完毕结束发送线程。这两个线程的同步,我使用了信号量。如上代码所示,单一的客户端,我可以通过公共声明信号量来实现收发线程都认识这个信号量,但是如果是多个客户端,有多对收发线程。
那收发线程中的多个信号量,怎么来确认?或者说有什么方式能让一对收发线程找到自己同步的那个信号量?
e.g:
A客户端  A收线程   A发线程    A信号量
B客户端  B收线程   B发线程    B信号量
在A发线程实例化后的A信号量,怎么让A收线程知道?并且给A发线程信号,而不是给B发线程信号?

#7


单位电脑太悲催了,引用都出不来,疯了! C# Tcp/Ip通讯 多线程中信号量怎么使用?

#8


都不清楚啊? C# Tcp/Ip通讯 多线程中信号量怎么使用?

#9


不是很清楚,个人认为如果想区分不同线程中的东东。
建议可以用字典试试,以地址为key。

#10


FlyBird 谢谢你的建议,可以试试!