C++ マルチスレッド学習 (12、特別なアトミック タイプ atomic_flag、スピン ロック)

目次

アトミックフラグ

スピンロック

スピンロックとミューテックスの違い

 1. 待機方法が異なります。

2. さまざまなリソース消費:

3. 適用されるシナリオは異なります。

シンプルなケース


他のアトミック タイプは is_lock_free() を使用して、ロック フリーかどうかを判断できます。

アトミックフラグ

atomic_flag: ロックフリーです

atomic_flag には 2 つの関数が含まれています。

1.test_and_set(): 設定されていない場合は設定され、設定されている場合は true を返します。

2.clear(): マークをクリアし、次の test_and_set() 呼び出しで false が返されるようにします。

スピンロック

スピンロックとミューテックスの違い

同じ例では、ミューテックスは、A がトイレに行き、B がドアで待っています。

スピンロックとは、A がトイレに行っている間、A がトイレに行って出てきて、B が直接トイレに行くまで、B はまだ自分のことをしていることを意味します。

 1. 待機方法が異なります。


        スピン ロック: スレッドがスピン ロックを要求するとき、そのロックがすでに他のスレッドによって占有されている場合、要求元のスレッドはスピンしてビジー待機方式で待機します。つまり、ロックが取得されるまでロックが利用可能かどうかを繰り返し確認します。 。
        ミューテックス ロック: スレッドがミューテックス ロックを要求するときに、そのロックがすでに他のスレッドによって占有されている場合、要求元のスレッドはブロック状態になり、ロックが取得されるまで起動されて実行を継続できません。



2. さまざまなリソース消費:


        スピンロック: スピン待機期間中、要求元のスレッドは常に CPU リソースを占有します。スピン待機時間が長すぎると、CPU リソースが無駄に使用されます。
        相互排他ロック: ブロッキング待機期間中、要求スレッドは CPU リソースを占有せず、スレッドはウェイクアップ後にロックを競合します。



3. 適用されるシナリオは異なります。


        スピン ロック: スピン待機は CPU リソースを消費するため、保護クリティカル セクションが小さく、ロック競合が非常に短い状況に適しています。
        相互排他ロック: ブロック待ちによって CPU リソースが占有されないため、保護クリティカルセクションが大きく、ロックの競合が激しい場合に適しています。

シンプルなケース

#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
//初始化:也可以用atomic_flag lock = {};
atomic_flag lock = ATOMIC_FLAG_INIT;//ATOMIC_FLAG_INIT这个宏定义是大括号:{}

void test1(int n)
{
	while (lock.test_and_set())//可以不传参,有重载的枚举类型【之前讲过】
	{
		printf("等待中...%d\n", n);
	}
	printf("线程完成...%d\n", n);
}
void test2(int n)
{
	printf("线程启动:%d\n",n);
	this_thread::sleep_for(1s);
	lock.clear();
	printf("线程运行结束:%d\n", n);
}
int main()
{
	lock.test_and_set();
	thread t1(test1, 1);
	thread t2(test2, 2);
	t1.join();
	t2.join();


	return 0;
}

おすすめ

転載: blog.csdn.net/q244645787/article/details/131614188