3

カーネル バージョン 2.6.10 と「プレーン」C を使用しています。

プログラムがクラッシュする理由について、2 つのスレッドに絞り込みました。

タイマースレッド

void TimerThread(void)
{
    while (exec) {
        usleep(10000);

        RSLTCD r = SUCCESS;
        // r = LockMutex(Mtx);
        do {
              // some process
        } while(1);     
        // r = UnlockMutex(Mtx);
    }
    return ;        // Not Reached
}

システムスレッド

void SystemThread(void)
{
    CreateThread(TimerThread, OALTHRD_DEFAULT_STACKSIZE, THREADPRI_NORMAL, 0, 0);
    for(;;){
        system("echo this is a SYSTEM CALL 1");
        system("echo this is a SYSTEM CALL 2");
    }    
}

残りのコードをすべて削除しました。この 2 つの「単純な」スレッドを実行しただけでも、数回 (50 ~ 100 回) ループするとプログラムがクラッシュします。また、system() が fork() を使用しており、fork()ing とミューテックスで問題が発生することもあると読みました。そのため、ミューテックス部分を削除しましたが、それでもクラッシュします。

fork()+execv() コンボと posix_spawn() を使用して、独自の「システム コール」関数を作成してみました。どちらの場合も同じ結果になりました。

また、usleep 以外のスリープ機能 (nano_sleep など) を使用してみました。それでもプログラムがクラッシュします。

マルチスレッド プロセスで system() と usleep() を使用すると問題がありますか? これらの関数を使用する以外に、他にどのような選択肢がありますか?

4

1 に答える 1

1

基本的に、マルチスレッドと "fork()" を混在させるのは簡単ではありません。役に立つヘルプを提供するには、SW に関するさらに多くの詳細が必要になります。スレッドと fork() を混在させた場合の問題については、http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-themを参照してください。

于 2013-03-04T10:06:28.280 に答える