【问题标题】:Block other threads from executing a statement block while current thread is executing it在当前线程正在执行语句块时阻止其他线程执行语句块
【发布时间】:2015-12-22 09:58:25
【问题描述】:

我想阻止所有其他线程执行,直到 SendReceive(Socket, strXmlFormat) 函数完成执行,因为它用于通过套接字发送数据并手动关闭连接。根据数据发送到服务器时的要求,在手动关闭连接之前,只需向服务器发送一个标志,就不必向它发送其他数据。所以我想要的是所有其他正在运行该进程的线程应该停止,直到这段代码完成执行。

process(int start, int end)
{
   // Block other threads from executing while the current thread executes this code block
   Socket = Connect(strSMSIP, strSMSPort);
   SendReceive(Socket, strXmlFormat);
  // undo blocking the threads  
}

这是创建线程和分配进程的方式:

for (int i = 0; i < 5; i++)
{
   int start = i+10
   int end=start+10;

    new Thread(delegate()
    {
        Process(start, end);
    }).Start();
 }

【问题讨论】:

  • per the requirement when the data is sent to the server ,no other data has to be sent to it until 在存在多个客户端的情况下很难实现,甚至可能分布在多台机器上。一个简单的lock 甚至机器范围的Mutex 都无济于事。如果有的话,您最好在您的服务器上强制执行此要求。
  • @Christian.K 这个进程只能在一台机器上运行。
  • 好的,那么如果该进程只有一个实例ever,那么请查看@Jakub Lortz 的答案。否则请查看Mutex 类以同步多个进程。
  • @Christian.K 它是一个 exe 文件,只能由调度程序在一台服务器上运行,但如果多个线程正在执行同一进程,该解决方案是否有效??

标签: c# multithreading sockets


【解决方案1】:

您正在寻找lock 声明

lock 关键字确保一个线程不进入代码的临界区,而另一个线程在临界区。如果另一个线程试图输入一个锁定的代码,它会等待、阻塞,直到对象被释放。

private object _lockObject = new object();
public void Process(int start, int end)
{
    lock (_lockObject)
    {
        Socket = Connect(strSMSIP, strSMSPort);
        SendReceive(Socket, strXmlFormat);
    }
}

注意,它只会同步一个进程的线程。

如果您的客户端可以在一台机器上运行多个进程,您可以使用命名为mutex

命名系统互斥锁在整个操作系统中都是可见的,并且可用于同步进程的活动。您可以使用接受名称的构造函数创建表示命名系统互斥体的互斥体对象。

private Mutex mutex = new Mutex(false, "Name");
public void Process(int start, int end)
{
    try
    {
        mutex.WaitOne();
        Socket = Connect(strSMSIP, strSMSPort);
        SendReceive(Socket, strXmlFormat);
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}

【讨论】:

  • 它是一个 exe 文件,只能由调度程序在一台服务器上运行,但如果多个线程正在执行同一进程,该解决方案是否有效?看到由于某些原因我写完代码后无法测试,所以我不得不盲目地相信你的解决方案。
  • @psyLogic 在这种情况下,您可以结合使用这两种解决方案 - 使用命名互斥锁以确保一次只有一个应用程序实例在运行,并使用 lock 同步线程。跨度>
  • 好的,谢谢!我会在确认后将答案标记为正确,所以请耐心等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多