0

sigprocmask fn を使用するマルチスレッド コードがあります。この呼び出しの使用は、マルチスレッド プログラムでは指定されていないことがわかっているので、この呼び出しを削除します。ただし、私が直面している問題は、この関数が呼び出されるとメイン スレッドが停止することです。なぜこれが起こるのか理解したい。この関数の呼び出しがコメント化されている場合、メイン スレッドは正常に実行されます。

Init 中の私のメイン プログラムでは、いくつかのスレッド プールが作成されます。その後、InitModule fn が呼び出される TestFunction 関数を呼び出します。InitModule では、sigprocmask が呼び出され、その他の初期化が行われます。その後、関数は TestFunction に戻ります。これが行き詰まるところです。

使い方は以下の通り

InitModule()
{
   sigset_t x;
   sigemptyset (&x);
   sigprocmask(SIG_SETMASK, &x, NULL)

   // Config read, DS Init, etc ....

}

TestFunction ()
{

  //  Code

  InitModule();
  malloc(); 
  printf("malloc done"); // --> This line is printed
  DoSomethingElse();

  printf("DoSomethingElse done");// --> Never reaches this point. 


  // .... Remaining code.....

}

InitModule から sigprocmask() 呼び出しを削除すると、"DoSomethingElse done" が出力されます。sigprocmask を使用するとスレッドがスタックするのはなぜですか?

この fn を呼び出した後の InitModule の残りのコードは常に実行されることに注意してください。呼び出し元の関数に戻ったときにのみ、スタックします。

4

1 に答える 1

0

一部の Linux スレッド化ライブラリの実装では、スレッドを内部的に使用してスレッド間で通信し、othread_* 関数を実装します。空のシグナル マスクを設定しようとしています。最初の 3 つのリアルタイム信号をそこに残してみてください。

于 2011-08-24T12:20:52.873 に答える