0

CreateThread() が使用されている場合、2 つのスレッドが単一の関数「ThreadProc」をスレッド プロシージャとして使用することは可能ですか?

HANDLE thread1= CreateThread( NULL, //Choose default security
                              0, //Default stack size
                              (LPTHREAD_START_ROUTINE)&ThreadProc,
                              //Routine to execute. I want this routine to be different each time as I want each  thread to perform a different functionality.
                              (LPVOID) &i, //Thread parameter
                              0, //Immediately run the thread
                              &dwThreadId //Thread Id
                            ) 
HANDLE thread2= CreateThread( NULL, //Choose default security
                              0, //Default stack size
                              (LPTHREAD_START_ROUTINE)&ThreadProc,
                              //Routine to execute. I want this routine to be different each time as I want each  thread to perform a different functionality.
                              (LPVOID) &i, //Thread parameter
                              0, //Immediately run the thread
                              &dwThreadId //Thread Id
                            ) 

上記のコードは、それぞれ同じ機能を持つ 2 つのスレッドを作成します (両方のスレッドのスレッド手順が同じであるため)。正しく実行していますか?

可能であれば、両方のスレッドが同じスレッド プロシージャを使用しているため、同期の問題が発生します。

これで私を助けてください。私は本当に混乱していて、インターネット上で何も見つけることができませんでした.

4

4 に答える 4

6

複数のスレッドのスレッド エントリ ポイントとして同じ関数を使用しても問題ありません。

ただし、投稿されたコードからのアドレスはi両方のスレッドに渡されています。いずれかのスレッドがこのメモリを変更し、もう一方のスレッドが読み取りを行うと、競合状態が発生しiます。それの宣言を見なければ、iおそらくローカル変数です。スレッドは存続期間中存在する必要があるため、これは危険ですi。そうiでない場合、スレッドにはダングリング ポインターがあります。スレッド引数を動的に割り当て、各スレッドがその引数を解放するのが一般的な方法です。

于 2013-05-02T08:23:19.917 に答える
5

はい、同じエントリ ポイントで開始する複数の (同時) スレッドが存在する可能性は十分にあります。OS/スレッド ライブラリが署名を指定してそれを呼び出すという事実を除けば、スレッド エントリ ポイント関数について特別なことは何もありません。複数のスレッドから他の関数​​を呼び出す場合と同じ注意事項で複数のスレッドを開始するために使用できます。非アトミック共有変数にアクセスするには同期が必要です。

各スレッドは独自のスタック領域を使用しますが、それはスレッド プロシージャが呼び出される前に OS によって割り当てられるため、スレッド プロシージャが呼び出されるまでに、新しいスレッドを作成して開始するために必要なすべての特別なアクションが既に実行されています。

于 2013-05-02T08:27:11.220 に答える
4

スレッドが同じコードを使用しているかどうかは関係ありません。同期にはまったく影響しません。それらが異なる関数であるかのように、まったく同じように動作します。潜在的なレースの問題は同じです。

おそらく、両方のスレッドに同じポインターを渡したくないでしょう。これはデータ競合につながる可能性があります。(確かに知るにはコードを見る必要がありますが。)

于 2013-05-02T08:23:29.587 に答える
2

あなたのコードは正しいです。両方のスレッド間に同期の問題はありません。同期が必要な場合は、同じスレッド プロシージャを使用しているからではなく、同じグローバル変数を変更している可能性があります。

于 2013-05-02T08:27:22.650 に答える