信号Vs的互斥(Semaphore Vs Mutex)

2019-09-22 05:14发布

我读了一下互斥和旗语。

我有一段代码

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

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

有人能给我在哪里可以使用互斥,临界区和信号灯一些实际senarios。

大概是我读很多。 在结束我现在有点糊涂。 有人可以清除思想。

PS:我已理解的是互斥和二进制信号量之间初级DIFF是所有权。 和计数信号量应作为一个信令机制。

Answer 1:

互斥和信号灯(我从来没有与CriticalSection的工作)之间的差异:

  • 当使用条件变量,它的锁必须是互斥。
  • 当使用超过1级可用的资源,你必须使用可用资源的数初始化的信号,所以当你在外面的资源,下一个线程块。
  • 当使用1个资源或一些代码,只能由1个线程来执行,你必须使用一个互斥体或1初始化的信号量的选择(这是OP的问题的情况下)。
  • 如果让一个线程等待,直到被另一个线程发出信号,需要用0 intialized信号量(()等待线程并sem.p,信号线不sem.v())。


Answer 2:

一个临界区对象是这里最简单的方法。 它是一个轻量级同步对象。

下面是一些代码为例:

#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函数和WaitForMultipleObjects的功能

随着螺纹:

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

互斥和/或信号要远为了这个目的。

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



文章来源: Semaphore Vs Mutex