线程管理---互斥量同步机制
来源:互联网 发布:js 离开页面时提示 编辑:程序博客网 时间:2024/05/29 10:31
互斥量机制
在计算机系统中有许多共享资源不允许用户并行使用,
像打印机这样的共享设备被称为“排它性资源”,
因为它一次只能由一个执行流访问。执行流必须以互斥的方式
执行访问排它性资源的代码。
互斥量(Mutex),又称为互斥锁,是一种用来保护临界区的特殊变量,
它可以处于锁定(locked)状态,也可以处于解锁(unlocked)状态:
如果互斥锁是锁定的,就是一个特定的线程持有这个互斥锁:
如果没有线程持有这个互斥锁,那么这个互斥锁就处于解锁状态。
//互斥量是最简单也是最有效的线程同步机制。程序可以用它来保护临界区,
//以获得对排它性资源的独占访问权。另外,互斥量只能被短时间地持有,
//使用完临界资源后应立即释放锁。
1.互斥量的操作(编程操作)
1.1:创建互斥量,并初始化
(1).静态初始化
对是静态分配的 pthread_mutex_t 变量来说值需要将
PTHREAD_MUTEX_INITIALIZER赋给变量就行了。
//eg: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
(2).动态初始化
对动态分配或者不使用默认互斥属性的互斥变量来说,需要
调用 pthread_mutex_int()函数来执行初始化工作。
//eg:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
// const pthread_mutexattr_t *restrict attr);
参数:
@mutex 是一个指向要初始化的互斥量的指针
@attr 传递 NULL 来初始化一个带有“默认属性”的互斥量,否则就要用类似于
线程属性对象所使用的方法,先创建互斥量属性对象,再用该属性对象来
创建互斥量。
返回值:
成功 返回 0,失败 返回一个错误码
2.2销毁互斥量
销毁互斥量使用 pthread_mutex_destroy()函数,原型如下:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//@ mutex 指向要销毁的互斥量的指针。
2.3加锁与解锁
2.3.1线程试图锁定互斥量的过程称之为加锁。
Pthreads 中有两个试图锁定互斥量的函数,
pthread_mutex_lock()和 pthread_mutex_ trylock()。
pthread_mutex_lock()函数会一直阻塞到互斥量可用为止,
而 pthread_mutex_trylock() 会尝试加锁,通常立即返回。函数原型如下:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
@ mutex 是需要加锁的互斥量。
返回值:
成功 返回 0,
失败 返回错误码,
注:如果,一个线程己持有锁的情况下,调用 pthread_mutex_trylock()函数错误码为 EBUSY。
2.3.2解锁是线程将互斥量由锁定状态变为解锁状态。
pthread_mutex_unlock()函数用来释放指定的互斥量。函数原型如下:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//线程需要进入临界区之前正确地获取适当的互斥量,并在线程离开临界区时释放互斥量。
程序示例 :
该程序使用互斥量来保证多线程同时输出顺序例子,互斥量保证获取的
线程打印完才让别的线程打印,杜绝了打印乱序的问题。
在计算机系统中有许多共享资源不允许用户并行使用,
像打印机这样的共享设备被称为“排它性资源”,
因为它一次只能由一个执行流访问。执行流必须以互斥的方式
执行访问排它性资源的代码。
互斥量(Mutex),又称为互斥锁,是一种用来保护临界区的特殊变量,
它可以处于锁定(locked)状态,也可以处于解锁(unlocked)状态:
如果互斥锁是锁定的,就是一个特定的线程持有这个互斥锁:
如果没有线程持有这个互斥锁,那么这个互斥锁就处于解锁状态。
//互斥量是最简单也是最有效的线程同步机制。程序可以用它来保护临界区,
//以获得对排它性资源的独占访问权。另外,互斥量只能被短时间地持有,
//使用完临界资源后应立即释放锁。
1.互斥量的操作(编程操作)
1.1:创建互斥量,并初始化
(1).静态初始化
对是静态分配的 pthread_mutex_t 变量来说值需要将
PTHREAD_MUTEX_INITIALIZER赋给变量就行了。
//eg: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
(2).动态初始化
对动态分配或者不使用默认互斥属性的互斥变量来说,需要
调用 pthread_mutex_int()函数来执行初始化工作。
//eg:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
// const pthread_mutexattr_t *restrict attr);
参数:
@mutex 是一个指向要初始化的互斥量的指针
@attr 传递 NULL 来初始化一个带有“默认属性”的互斥量,否则就要用类似于
线程属性对象所使用的方法,先创建互斥量属性对象,再用该属性对象来
创建互斥量。
返回值:
成功 返回 0,失败 返回一个错误码
2.2销毁互斥量
销毁互斥量使用 pthread_mutex_destroy()函数,原型如下:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//@ mutex 指向要销毁的互斥量的指针。
2.3加锁与解锁
2.3.1线程试图锁定互斥量的过程称之为加锁。
Pthreads 中有两个试图锁定互斥量的函数,
pthread_mutex_lock()和 pthread_mutex_ trylock()。
pthread_mutex_lock()函数会一直阻塞到互斥量可用为止,
而 pthread_mutex_trylock() 会尝试加锁,通常立即返回。函数原型如下:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
@ mutex 是需要加锁的互斥量。
返回值:
成功 返回 0,
失败 返回错误码,
注:如果,一个线程己持有锁的情况下,调用 pthread_mutex_trylock()函数错误码为 EBUSY。
2.3.2解锁是线程将互斥量由锁定状态变为解锁状态。
pthread_mutex_unlock()函数用来释放指定的互斥量。函数原型如下:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//线程需要进入临界区之前正确地获取适当的互斥量,并在线程离开临界区时释放互斥量。
程序示例 :
该程序使用互斥量来保证多线程同时输出顺序例子,互斥量保证获取的
线程打印完才让别的线程打印,杜绝了打印乱序的问题。
1 #include<stdio.h>2 #include<string.h>3 #include<pthread.h>4 #include<stdlib.h>5 #include<unistd.h>6 7 pthread_t tid[2]; //定义线程名8 pthread_mutex_t lock; //定义互斥锁变量9 10 void* doPrint(void *arg) //线程执行函数11 {12 int id = (long)arg;13 int i = 0;14 pthread_mutex_lock(&lock);// 使用互斥量保护临界区,加锁15 printf("Job %d started\n", id);16 for (i = 0; i < 5; i++) {17 printf("Job %d printing\n", id);18 usleep(10);19 }20 printf("Job %d finished\n", id);21 pthread_mutex_unlock(&lock); //解锁22 return NULL;23 }24 25 int main(void)26 {27 long i = 0;28 int err;29 30 if (pthread_mutex_init(&lock, NULL) != 0) /* 动态初始化互斥量*/ {31 printf("\n Mutex init failed\n");32 return 1;33 }34 while (i < 2) {35 err = pthread_create(&(tid[i]), NULL, &doPrint, (void*)i);36 if (err != 0)37 printf("Can't create thread :[%s]", strerror(err));38 i++;39 }40 pthread_join(tid[0], NULL);41 pthread_join(tid[1], NULL);42 pthread_mutex_destroy(&lock); //销毁互斥量43 44 return 0;45 }
0 0
- 线程管理---互斥量同步机制
- linux 线程管理、同步机制等
- 线程同步机制之互斥量
- 线程的同步机制
- windows 线程同步机制
- linux线程同步机制
- Boost 线程同步机制
- nachos 线程同步机制
- 线程同步机制
- pthread线程同步机制
- 线程同步-event机制
- 线程同步机制初识
- window 线程同步机制
- 进程/线程 同步机制
- 进程线程同步机制
- 多线程/线程同步机制
- java线程同步机制
- linux 线程同步机制
- 【JavaScript】使用jQuery操作DOM
- clion 快捷键
- zImage和uImage的区别
- 基数树(Radix Tree)
- 淘宝HSF服务的原理以及简单的实现
- 线程管理---互斥量同步机制
- web前端开发学习预备知识
- Android 简单Dialog的使用.
- 当我步入直播这道坑
- 《算法(第四版)》 习题:1.3.19
- SQLServer之视图篇
- Java并发编程——this引用逸出("this" Escape)
- 是否同一棵二叉搜索树 (25分)
- CentOS常用基础操作