クリティカルセクション(Critical section)を Curlで実装する方法 - Printable Version +- Curl Global Community (https://communities.curl.com) +-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1) +--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2) +--- Thread: クリティカルセクション(Critical section)を Curlで実装する方法 (/showthread.php?tid=1309) |
クリティカルセクション(Critical section)を Curlで実装する方法 - Sanchez Chung - 01-15-2016 あるグローバル変数(例えば、Array変数客体)を複数の処理(スレッド)が同時期に実行されると、 破綻をきたす事があるんですが、これを防ぐために使えるのが クリティカルセクション(Critical section)と知ています。 このCritical sectionの事をCurlで実装しようとしています。 C++とかVC++はインターネット上でいくつかのサンプルコードが見つかりますが、 Curlではなさそうですね。 これに対して御存じの方がいらっしゃれば教えていただければ幸いです。 添付のコードはマイクロソフトのMSDNのサンプルです。(C++のコード) URLは; https://msdn.microsoft.com/en-us/library/windows/desktop/ms686908(v=vs.85).aspx です。 // Global variable CRITICAL_SECTION CriticalSection; int main( void ) { ... // Initialize the critical section one time only. if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x00000400) ) return; ... // Release resources used by the critical section object. DeleteCriticalSection(&CriticalSection); } DWORD WINAPI ThreadProc( LPVOID lpParameter ) { ... // Request ownership of the critical section. EnterCriticalSection(&CriticalSection); // Access the shared resource. // Release ownership of the critical section. LeaveCriticalSection(&CriticalSection); ... return 1; } RE: クリティカルセクション(Critical section)を Curlで実装する方法 - dyoshida - 01-15-2016 過去のスレッドをみるとCurlアプレットはシングルスレッドで動作するようなので、 クリティカルセクションは気にしなくてよいのでは。 マルチスレッド・マルチコアへの対応について http://communities.curl.com/showthread.php?tid=257 ただ、dispatch-events(プロシージャ)を使っている場合は、WindowsでPeekMessage、DispatchMessage関数を 使ってメッセージポンプを行った場合と同様、処理の途中でイベントハンドラが呼び出されることには注意する必要が ありそうです。 RE: クリティカルセクション(Critical section)を Curlで実装する方法 - Sanchez Chung - 01-18-2016 アドバイス頂きましてどうもありがとうございました。 サーバーからソケットメッセージが入ってくると「after 0s」で実行されますが、 この場合、このプロセスが終わる前にグローバル変数の値から他のプロセスの accessを防ぐ方法が良く見つかりません。 なんか良い方法(サンプルコード)がありましたら教えて頂けると 非常に助かります。 RE: クリティカルセクション(Critical section)を Curlで実装する方法 - dyoshida - 01-18-2016 「after 0s」はWindowsのPostMessageと同じように、イベントキューの最後に積まれると考えてよさそうです。 シングルスレッドであっても、メッセージループで既に積まれている他のイベントハンドラが全て実行された後に 「after 0s」に記述した処理が実行されることになるので、簡単なStateMachineを組むか、複雑でなければ 単純なフラグ管理でもよいかもしれません。 あまり実用的なコードではないですが、下記のようにグローバル変数を管理するクラスにlockフラグを つけてもaccessを防げそうです。 Code: {curl 8.0 applet} |