CThreadとは?

ブロックチェーンはマルチスレッドで稼動しておりますので、スレッドの管理が必須です。
ところで、旧コアはboostのスレッドを毎回立ち上げ……、対して最新コアはCThreadによる管理でした。
……。古いコアのブロックチェーンがよく落ちる原因は、間違いなく「ここ」です。(^^;
※ 現在、bitcoinのCThreadではなく、 template <typename T> cla_thread<T>という「this_callメソッド」をマルチスレッド化できるクラスを実装いたしまして、 boostスレッドからの移植をしております。移植が進むにつれ、例えば「終了時の落ち方」が良くなってきました。(^^;
その他、LOCK(), TRY_LOCK()などのbitcoin用のマクロが利用可能で、さらにはイベント処理用のメソッドを積んでおります。そして、メモリは自動管理です。
スレッドモデルについては、Windows版はwin_thread(OSになじんで軽量), その他はpthreadの見込みです。

LOCK(), LOCK2(), LOCK3()とは?

マルチスレッドの場合、共有された変数に「アトミック性」が求められます。
この共有される変数には「static変数」「メンバ」「externのグローバル変数」がございます。
これらの変数を読み書きする前に、これらマクロ(LOCK, LOCK2, LOCK3)を挟みます。
このマクロを使用すると、定義された「スコープ内」において「ミューテックスの処理」が実装されます。
この作用により、複数のスレッドが同時に対象スコープへ突入しても、一つずつ処理されるようになります。

TRY_LOCK()とは?

今、LOCKできるのかを試すマクロです。
もちろん、エラーではないので「待てば」ロックできます。しかし、全体の処理速度に影響が出ます。
独立した複数の処理を行う場合は、このマクロでロックできたスコープからの処理になります。
※ win_threadの例では、::WaitForSingleObjectの第二引数に「INFINITE以外」を指定した場合です。
その場合、その指定された時間までは待機しますが、それを越えるとロック失敗で制御が戻ってきます。

ENTER_CRITICAL_SECTION(), LEAVE_CRITICAL_SECTION()とは?

スコープを超えてロックしたいときに使います。
ただし、ENTERしてLEAVEを忘れると「デッドロック」いたします。お決まりというあれ、ですね。(^^;
そのため、毎回自分でLEAVEを書くスタイルではなく、デストラクタにLEAVEをさせる構造にすべきです。

ミューテックスとは?

ミューテックスとは、複数のスレッド通過を「一つずつ」にするためのオブジェクトです。
そして、このミューテックスには2タイプが存在いたします。
それは「再帰可能なミューテックス」と「待機可能なミューテックス」です。
そして「待機」に対して必要性を感じない大部分の場面では「再帰可能なミューテックス」を使うべきです。

再帰可能なミューテックス:
再帰できますので、同じスレッドIDを持つスレッドが同じミューテックスを通過してもロックされません。
しかしながら、同じスレッドIDに対してロックが作用しないため、イベントによる待機制御ができません。

待機可能なミューテックス:
同じスレッドIDを持つスレッドが同じミューテックスを通過してもロックされます。
その分、同じスレッドIDに対してロックが作用しますので、イベントによる待機制御ができます。

待機可能なミューテックスは、使い方を誤ると「デッドロック」しますので、その使用は限定的にすべきです。
bitcoinの定義では、再帰可能は「CCriticalSection」、待機可能は「CMutex」になっておりました。

サンプルコード

static int32_t nCounter=0;
static CCriticalSection cs_main;

void fn_thread(void *) {
	LOCK(cs_main);
	++nCounter;
	::fprintf(stdout, "nCounter=%d\n", nCounter);
}

int main(int argc, char *argv[]) {
	CThread thread[32];
	for(int i=0; i<32; ++i)
		thread[i].set_fn(fn_thread, nullptr);
	for(int i=0; i<32; ++i)
		thread[i].start();
	for(int i=0; i<32; ++i)
		thread[i].wait();
	return 0;
}

		
□ 本ページをご覧いただきました方は、以下のページもよくご覧いただいております。
■ 集計中.....