Thread Rating:
  • 352 Vote(s) - 2.76 Average
  • 1
  • 2
  • 3
  • 4
  • 5
クリティカルセクション(Critical section)を Curlで実装する方法
01-15-2016, 01:37 PM,
#1
クリティカルセクション(Critical section)を Curlで実装する方法
あるグローバル変数(例えば、Array変数客体)を複数の処理(スレッド)が同時期に実行されると、
破綻をきたす事があるんですが、これを防ぐために使えるのが
クリティカルセクション(Critical section)と知ています。

このCritical sectionの事をCurlで実装しようとしています。

C++とかVC++はインターネット上でいくつかのサンプルコードが見つかりますが、
Curlではなさそうですね。

これに対して御存じの方がいらっしゃれば教えていただければ幸いです。

添付のコードはマイクロソフトのMSDNのサンプルです。(C++のコード)
URLは;
https://msdn.microsoft.com/en-us/library...s.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;
}
01-15-2016, 06:51 PM, (This post was last modified: 01-15-2016, 10:11 PM by dyoshida.)
#2
RE: クリティカルセクション(Critical section)を Curlで実装する方法
過去のスレッドをみるとCurlアプレットはシングルスレッドで動作するようなので、
クリティカルセクションは気にしなくてよいのでは。

マルチスレッド・マルチコアへの対応について
http://communities.curl.com/showthread.php?tid=257

ただ、dispatch-events(プロシージャ)を使っている場合は、WindowsでPeekMessage、DispatchMessage関数を
使ってメッセージポンプを行った場合と同様、処理の途中でイベントハンドラが呼び出されることには注意する必要が
ありそうです。
01-18-2016, 03:20 PM, (This post was last modified: 01-18-2016, 03:21 PM by Sanchez Chung.)
#3
RE: クリティカルセクション(Critical section)を Curlで実装する方法
アドバイス頂きましてどうもありがとうございました。

サーバーからソケットメッセージが入ってくると「after 0s」で実行されますが、
この場合、このプロセスが終わる前にグローバル変数の値から他のプロセスの
accessを防ぐ方法が良く見つかりません。

なんか良い方法(サンプルコード)がありましたら教えて頂けると
非常に助かります。
01-18-2016, 05:20 PM,
#4
RE: クリティカルセクション(Critical section)を Curlで実装する方法
「after 0s」はWindowsのPostMessageと同じように、イベントキューの最後に積まれると考えてよさそうです。

シングルスレッドであっても、メッセージループで既に積まれている他のイベントハンドラが全て実行された後に
「after 0s」に記述した処理が実行されることになるので、簡単なStateMachineを組むか、複雑でなければ
単純なフラグ管理でもよいかもしれません。

あまり実用的なコードではないですが、下記のようにグローバル変数を管理するクラスにlockフラグを
つけてもaccessを防げそうです。
Code:
{curl 8.0 applet}

{define-class public GlobalParams
  field public locked?:bool = false
  field _value1:int
  
  {setter public {value1 v:int}
    {if self.locked? then
        {dump "set value1 ignored!", v}
     else
        set self._value1 = v
    }
  }
  
  {getter public {value1}:int
    {return self._value1}
  }
}

{def g_params = {GlobalParams}}


{value
    set g_params.value1 = 1
    
    {CommandButton
        {on Action do
            set g_params.locked? = true
            
            {after 0s do
                {popup-message g_params.value1}
                set g_params.locked? = false
                
                set g_params.value1 = 3
                {popup-message g_params.value1}
            }
            
            set g_params.value1 = 2
        }
    }
}

Forum Jump:


Users browsing this thread:
3 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1309')