3

4 つのスレッドを起動するプログラムを実装しています。

機能は次のとおりです。

void* SOURCE_in(struct SOURCE_1*);
void* SOURCE_out(struct SOURCE*);
void* SINK_out(struct SINK_1*);
void* SINK_in(struct SINK*);

関数は、4 つのブロック間の通信を可能にします。ブロック 1 はブロック 2 と通信します。ブロック 2 は 3 番目のブロックと情報を共有します。ブロック 3 は、ブロック 4 と情報を通信します。

私の問題はmain.cにあります

int main(int argc, char** argv){

    extern int p, e_source, e_sink_1, l_sink, l_source_1, flag, ctr_source;
    extern int ctr_source_1, ctr_sink, ctr_sink1;

        SOURCE source;      /*C struct*/
        SINK sink;          /*C struct*/
        SOURCE_1 source_1;  /*C struct*/
        SINK_1 sink_1;      /*C struct*/

        HANDLE CHT[4];

        p = 0;
        e_source =  flag = 0;
        l_sink = e_sink_1 = l_source_1 = 1;
        max = 5;
        ctr_source = ctr_source_1 = ctr_sink = ctr_sink_1 = 0;

        /*Initialize FIFO*/
        F *f1 = fifo_init(10);
        F *f2 = fifo_init(10);

        /*Connect FIFO and modules*/
        source.output_source = f1;
        sink.input_sink = f1;

        sink_1.output_sink = f2;
        source_1.input_source = f2;

        /*Create Threads*/
        CHT[0] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_out, 0, &f1);
        CHT[1] = (HANDLE)_beginthread((void (*)(void *))&SINK_in, 0, &f1);
        CHT[2] = (HANDLE)_beginthread((void (*)(void *))&SINK_out, 0, &f2);
        CHT[3] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_in, 0, &f2);

        /* Wait until all threads have terminated */

        WaitForSingleObject(CHT[0], INFINITE);
        WaitForSingleObject(CHT[1], INFINITE);
        WaitForSingleObject(CHT[2], INFINITE);
        WaitForSingleObject(CHT[3], INFINITE);

        getchar();

        return 0;}

WaitForSingleObject 関数が _beginthread では機能しないことを読みました....しかし、私の関数は nunsigned __stdcall 型ではありません...

エラーなしでプログラムをビルドし、ブレークポイントを使用してテストしましたが、問題ありませんでした。コンパイルすると、次の問題が発生します。

スレッド 'Win32 スレッド' (0x11ec) はコード 0 (0x0) で終了しました。スレッド 'Win32 スレッド' (0x918) はコード 0 (0x0) で終了しました。スレッド 'Win32 スレッド' (0x8a4) はコード 0 (0x0) で終了しました。スレッド 'Win32 スレッド' (0x2a8) がコード -1073741510 (0xc000013a) で終了しました。スレッド 'Win32 スレッド' (0x12f8) がコード -1073741510 (0xc000013a) で終了しました。プログラム '[3984] SW=SW.exe: Native' はコード -1073741510 (0xc000013a) で終了しました。

プログラムは関数 getchar() に到達しません

このプログラムを実行する前に、読み取りと書き込みの 2 つのブロック間で通信を行うプログラムを作成しました。その場合、問題はありませんでした。

関数 WaitForSingleObject を使用しない場合、問題はなくなりますが、私のプログラムは、ほとんどの場合、終了する前に停止します。

各スレッドが使用する関数は、ブレークで停止します。しかし、私はその休憩が現れるまで他のものを続けてほしい..

4

2 に答える 2

5

のドキュメントで_beginthreadは、待機関数のいずれかを使用できないことが説明されています。

次のサンプル コードは、同期 API WaitForSingleObject で _beginthreadex によって返されるスレッド ハンドルを使用する方法を示しています。メイン スレッドは、2 番目のスレッドが終了するのを待ってから続行します。2 番目のスレッドが _endthreadex を呼び出すと、そのスレッド オブジェクトがシグナル状態になります。これにより、プライマリ スレッドの実行を継続できます。これは、_beginthread と _endthread では実行できません。これは、_endthread が CloseHandle を呼び出し、スレッド オブジェクトをシグナル状態に設定する前に破棄するためです。

また、このテキストは、_beginthreadex代わりに使用するという解決策も提供します。

あなたがそれを言うとき、あなたは質問でこれをほのめかしていると思います

しかし、私の関数は __stdcall ではありません

__stdcall呼び出し規約を使用するように関数を変更するだけです。

于 2012-05-04T12:04:28.610 に答える
0

これが役立つかどうかはわかりませんが、試してみてください。WaitForSingleObject は Windows API でのみ機能すると思います。したがって、次を使用してスレッドを作成する必要がありますCreateThread(tge MSDN で API を検索できます。beginthread よりも少し複雑ですが、それほど複雑ではありません。セキュリティなどに関心がない場合、なじみのない構造体のほとんどは NULL に設定できます)。 . CreateThread は、待機できるハンドルを返します。

beginthreadつまり、WaitForSingleObject の動作は未定義になります。この場合、永遠に待機する可能性があり、このため getchar は呼び出されません。

于 2012-05-04T12:03:27.003 に答える