C++ 信号量与互斥量

C++ 信号量与互斥量,c++,multithreading,synchronization,C++,Multithreading,Synchronization,我读了一些互斥和信号量 我有一段代码 int func() { i++; return i; } 我被声明为一个全局变量。 如果我创建计数信号量,计数为3,它不会有竞争条件吗?这是否意味着在这种情况下我应该使用二进制信号量或互斥 有谁能给我一些实用的senarios,其中可以使用互斥、临界区和信号量 也许我读了很多书。最后我有点困惑了。有人能澄清这个想法吗 附言:我知道互斥和二进制信号量之间的主要区别在于所有权。计数信号应该用作一种信号机制。a是最简单的方法。它是一个轻量级的同步对象 以下

我读了一些互斥和信号量

我有一段代码

int func()
{
 i++;
 return i;
}
我被声明为一个全局变量。 如果我创建计数信号量,计数为3,它不会有竞争条件吗?这是否意味着在这种情况下我应该使用二进制信号量或互斥

有谁能给我一些实用的senarios,其中可以使用互斥、临界区和信号量

也许我读了很多书。最后我有点困惑了。有人能澄清这个想法吗

附言:我知道互斥和二进制信号量之间的主要区别在于所有权。计数信号应该用作一种信号机制。

a是最简单的方法。它是一个轻量级的同步对象

以下是一些代码示例:

#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
}
互斥锁和/或信号量将为此发挥更大作用

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

A是最简单的方法。它是一个轻量级的同步对象

以下是一些代码示例:

#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
}
互斥锁和/或信号量将为此发挥更大作用


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

互斥和信号量之间的差异(我从未使用CriticalSection):

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

  • 互斥和信号量之间的差异(我从未使用过CriticalSection):

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

    没错,在这种情况下,互斥是正确的选择。但是,这个问题对于SO imo来说太广泛了。您能解释一下不同的线程将如何访问
    i
    ?假设我通过for循环创建100个线程。单个线程调用这个函数。但是我已经创建了一个计数为5的信号量。那么我仍然需要一个互斥锁来访问共享资源rit?没错,在这种情况下,互斥锁是正确的选择。但是,这个问题对于SO imo来说太广泛了。您能解释一下不同的线程将如何访问
    i
    ?假设我通过for循环创建100个线程。单个线程调用这个函数。但是我已经创建了一个计数为5的信号量。那么我仍然需要一个互斥锁来访问共享资源rit?我知道关键部分是最好的。但我的怀疑是在信号量和互斥量之间!那么,你可能会有不同的情况。我不明白为什么信号量对所描述的问题有任何有意义的帮助。答案已编辑。我知道关键部分是最好的。但我的怀疑是在信号量和互斥量之间!那么,你可能会有不同的情况。我不明白为什么信号量对所描述的问题有任何有意义的帮助。答案已编辑。