基于多线程并发-线程同步-系统实现

系统实现:相对于STL来说非标准的实现,Linux和Windows平台各自的实现。
线程同步:通过限制多个线程同时执行某段代码来保护资源的。

一、linux互斥体

1、线程互斥量 pthread_mutex_t 的初始化

a、定义再初始化:

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

pthread_mutex_init函数的第二个参数attr是定义互斥锁的属性,一般为NULL。成功初始化返回0,否则返回其他值(错误编号)。

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:

  • PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。

  • PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

  • PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。

  • PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。

b、定义同时初始化

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

2、获取锁
a、阻塞接口

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
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);// 销毁
}

二、Windows临界区(critical section)

//创建:
	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

你可能感兴趣的:(并发编程,c++,互斥体,临界值,pthread_mutex_t,线程同步)