【问题标题】:Semaphore Vs Mutex信号量与互斥量
【发布时间】:2012-09-01 09:30:23
【问题描述】:

我正在阅读一些互斥量和信号量。

我有一段代码

int func()
{
 i++;
 return i;
}

i 在外部某处被声明为全局变量。 如果我创建计数为 3 的计数信号量,它不会有竞争条件吗?这是否意味着在这种情况下我应该使用二进制信号量或互斥量?

谁能给我一些可以使用互斥锁、临界区和信号量的实用场景。

可能我读了很多。最后,我现在有点困惑。谁能理清思路。

P.S:我知道互斥量和二进制信号量之间的主要区别是所有权。和计数信号量应该用作信号机制。

【问题讨论】:

  • 你是对的,在这种情况下,互斥锁是正确的选择。但是,就目前而言,这个问题对于 SO imo 来说太宽泛了。
  • 你能解释一下不同线程如何访问i吗?
  • 假设我正在通过一个 for 循环创建 100 个线程。单个线程调用此函数。但是我创建了一个计数为 5 的信号量。那么我仍然需要一个互斥锁来访问共享资源 rit 吗?

标签: c++ multithreading synchronization


【解决方案1】:

互斥量和信号量之间的区别(我从未使用过 CriticalSection):

  • 使用条件变量时,其锁必须是互斥体。
  • 当使用超过 1 个可用资源时,您必须使用用可用资源数量初始化的信号量,因此当您的资源不足时,下一个线程会阻塞。
  • 当使用 1 个资源或某些只能由 1 个线程执行的代码时,您可以选择使用互斥锁或用 1 初始化的信号量(OP 的问题就是这种情况)。
  • 当让一个线程等待直到另一个线程发出信号时,您需要一个初始化为 0 的信号量(等待线程执行 sem.p(),信号线程执行 sem.v())。

【讨论】:

    【解决方案2】:

    critical section object 是这里最简单的方法。它是一个轻量级的同步对象。

    以下是一些代码示例:

    #define NUMBER_OF_THREADS 100
    
    // global
    CRITICAL_SECTION csMyCriticalSectionObject;
    int i = 0;
    HANDLE hThread[NUMBER_OF_THREADS];
    
    
    
    int main(int argc, char *argv[]) 
    {
      // initialize the critical section object
      InitializeCriticalSection(&csMyCriticalSectionObject);
      // create 100 threads:
      for (int n = 0; n < NUMBER_OF_THREADS; n++)
      {
        if (!CreateThread(NULL,0,func,hThread[n],0,NULL)) 
        {
          fprintf(stderr,"Failed to create thread\n");
        } 
      }
      // wait for all 100 threads:
     WaitForMultipleObjects(NUMBER_OF_THREADS,hThread,TRUE,INFINITE);
     // this can be made more detailed/complex to find each thread ending with its
     // exit code. See documentation for that
    }
    

    链接:CreateThread functionWaitForMultipleObjects function

    用线程:

    // i is global, no need for i to returned by the thread
    DWORD WINAPI func( LPVOID lpvParam ) 
    {
      EnterCriticalSection(&csMyCriticalSectionObject);
      i++;
      LeaveCriticalSection(&csMyCriticalSectionObject);
      return GetLastError();
    }
    

    互斥量和/或信号量为此目的而走得很远。

    编辑:信号量基本上是一个可以多次释放的互斥锁。它存储了释放操作的数量,因此可以释放相同数量的等待。

    【讨论】:

    • 我知道关键部分是最好的。但我的疑惑是在信号量和互斥量之间!
    • 好吧,那你可能有不同的情况。我不明白为什么信号量对所描述的问题有任何有意义的帮助。答案已编辑。
    猜你喜欢
    • 2017-08-24
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多