系统实现:相对于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、使用示例文章来源:https://www.toymoban.com/news/detail-475262.html
#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);// 销毁
}
二、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文章来源地址https://www.toymoban.com/news/detail-475262.html
到了这里,关于基于多线程并发-线程同步-系统实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!