1

私はミューテックスとセマフォを少し読んでいました。

私はコードを持っています

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

i はグローバル変数として外部のどこかで宣言されています。カウント 3 でカウント セマフォを作成すると、競合状態になりませんか? この場合、バイナリセマフォまたはミューテックスを使用する必要があるということですか?

Mutex、クリティカル セクション、およびセマフォを使用できる実用的なシナリオを教えてください。

おそらく私はたくさん読んでいます。最後に、私は今少し混乱しています。誰かがその考えをクリアできますか。

PS: ミューテックスとバイナリ セマフォの主な違いは所有権であることを理解しました。また、カウント セマフォはシグナリング メカニズムとして使用する必要があります。

4

2 に答える 2

7

ミューテックスとセマフォの違い (私は CriticalSection を使ったことはありません):

  • 条件変数を使用する場合、そのロックはミューテックスでなければなりません。
  • 複数の使用可能なリソースを使用する場合は、使用可能なリソースの数で初期化されたセマフォを使用する必要があるため、リソースがなくなると次のスレッドがブロックされます。
  • 1 つのリソースまたは 1 つのスレッドでしか実行できないコードを使用する場合は、ミューテックスまたは 1 で初期化されたセマフォを使用することを選択できます (これは OP の質問の場合です)。
  • 別のスレッドからシグナルが送られるまでスレッドを待機させる場合、0 で初期化されたセマフォが必要です (待機スレッドは sem.p() を実行し、シグナル スレッドは sem.v() を実行します)。
于 2012-09-07T14:52:24.077 に答える
0

ここでは、クリティカル セクション オブジェクトを使用するのが最も簡単な方法です。これは軽量の同期オブジェクトです。

例としていくつかのコードを次に示します。

#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();
}

ミューテックスおよび/またはセマフォは、この目的のために遠くまで行きます。

編集: セマフォは基本的に複数回解放できるミューテックスです。解放操作の数を格納するため、同じ数の待機を解放できます。

于 2012-09-07T13:55:05.343 に答える