マルチスレッド同時実行、スレッド同期システムの実装に基づく

システム実装: STL と比較すると、非標準実装であり、Linux および Windows プラットフォームの実装です。
スレッド同期: 複数のスレッドが特定のコード部分を同時に実行できないように制限することで、リソースを保護します。

1、Linuxミューテックス

1. スレッドミューテックス pthread_mutex_t の初期化

a. 再初期化を定義します。

pthread_mutex_t mymutex;//定义互斥体
pthread_mutex_init(&mymutex, NULL);// 初始化

pthread_mutex_init 関数の 2 番目のパラメータ attr は、ミューテックスを定義する属性であり、通常は NULL です。初期化が成功した場合は 0 を返し、それ以外の場合は別の値 (エラー番号) を返します。

ミューテックスの属性は、ロックの作成時に指定されます。LinuxThreads 実装には、ロック タイプ属性が 1 つだけあります。すでにロックされているミューテックスをロックしようとすると、ロック タイプが異なると動作も異なります。現在 (glibc2.2.3、linuxthreads0.9) から選択できる値は 4 つあります。

  • PTHREAD_MUTEX_TIMED_NP、これはデフォルト値であり、通常のロックです。スレッドがロックされると、ロックを要求している残りのスレッドは待機キューを形成し、ロック解除後に優先順位に従ってロックを取得します。このロック戦略により、リソース割り当ての公平性が保証されます。

  • PTHREAD_MUTEX_RECURSIVE_NP (ネストされたロック) を使用すると、同じスレッドが同じロックを複数回正常に取得し、複数のロック解除を通じてロックを解除できます。別のスレッドからのリクエストの場合は、ロックしているスレッドのロックが解除されたときに再競合します。

  • PTHREAD_MUTEX_ERRORCHECK_NP、エラー検出ロック。同じスレッドが同じロックを要求した場合は EDEADLK を返します。それ以外の場合は、PTHREAD_MUTEX_TIMED_NP タイプのアクションと同じです。これにより、複数のロックが許可されていない場合でも、最も単純なケースでデッドロックが発生しなくなります。

  • PTHREAD_MUTEX_ADAPTIVE_NP、適応ロックは最も単純なロック タイプで、ロック解除を待機するだけで、その後再競合します。

b. 同時初期化の定義

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

2. ロックを取得し
、インターフェイスをブロックします

int ret = pthread_mutex_lock(&mymutex);// 阻塞锁定,

すでにロックが保持されている場合は待機を一時停止します。

b. ノンブロッキングインターフェイス

int ret = pthread_mutex_trylock(&mymutex);//非阻塞式锁定,

ロックがすでに保持されている場合、ハングして待機するのではなく、EBUSY を返します。
3.ロックを解除する

ret = pthread_mutex_unlock(&mymutex);// 解锁

4.破壊する

ret = pthread_mutex_destroy(&mymutex);// 销毁

5. 使用例

#include<pthread.h>
int main()
{
    
    
	pthread_mutex_t mymutex;//定义互斥体
	pthread_mutex_init(&mymutex, NULL);// 初始化
	int ret = pthread_mutex_lock(&mymutex);// 阻塞锁定,
	//int ret = pthread_mutex_trylock(&mymutex);//非阻塞式锁定,
	ret = pthread_mutex_unlock(&mymutex);// 解锁
	ret = pthread_mutex_destroy(&mymutex);// 销毁
}

2、Windowsのクリティカルセクション(クリティカルセクション)

//创建:
	CRITICAL_SECTION my_winsec;//创建windows中的临界区,类似与互斥量,使用前必须初始化

//初始化:(通常在类构造函数中初始化)
	InitializeCriticalSection(&my_winsec);//初始化临界区

//临界区使用:
	EnterCriticalSection(&my_winsec);//进入临界区(加锁)
	myQueue.push_back(i);
	LeaveCriticalSection(&my_winsec);//离开临界区(解锁)

間違いや不足がある場合は、コメントやご指摘をお待ちしております。作成は簡単ではありませんので、転載の際は出典を明記してください。お役に立ちましたら、ぜひ「いいね」とフォローをお願いいたします (⊙o⊙)
詳細については、私の個人ブログをフォローしてください: https://blog.csdn.net/qq_43148810

おすすめ

転載: blog.csdn.net/qq_43148810/article/details/130649461