linux多线程编程学习笔记(2)

1)互斥锁(互斥访问,间接制约关系)

1.1)原理

互斥锁以排他方式防止共享数据被并发访问。互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享数据资源与某个特定互斥锁在逻辑上绑定。
(1)在访问该资源前,首先申请该互斥锁,如果该互斥锁处于开锁状态,则申请到该锁对象,并立即占有该锁(使该锁处于锁定状态),以防止其它线程访问该资源;如果该互斥锁处于锁定状态,默认阻塞当前进程。
(2)只有锁定该互斥锁的进程才能释放该互斥锁。其他线程试图释放操作无效。

1.2)初始化和销毁互斥锁

(1)定义互斥锁(全局变量)

pthread_mutex_t lock;

(2)初始化互斥锁

int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t* attr);

第1个参数mutex是指向要初始化的互斥锁的指针。
第2个参数mutexattr是指向属性对象的指针,该属性对象定义要初始化的互斥锁的属性。如果该指针为NULL,则使用默认的属性。
使用默认属性初始化互斥锁:

pthread_mutex_init(&lock,NULL);

使用自定义属性初始化互斥锁:

pthread_mutexattr_t mattr;
pthread_mutex_init(&lock,&mattr);

(3)销毁互斥锁

int pthread_mutex_destroy(pthread_mutex_t* mutex);

1.3)申请互斥锁

如果一个线程要占用一共享资源,其必须先申请对应的互斥锁。
阻塞方式申请互斥锁:

int pthread_mutex_lock(pthread_mutex_t* mutex);

非阻塞方式申请互斥锁:

int pthread_mutex_trylock(pthread_mutex_t* mutex);

1.4)释放互斥锁

int pthread_mutex_unlock(pthread_mutex_t* mutex);

2)条件变量(同步访问,直接制约关系)

2.1)初始化、销毁条件变量

(1)定义条件变量(全局变量)

pthread_cond_t condition;

(2)初始化条件变量

int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t* condattr);

第1个参数cond是指向要初始化或损坏的条件变量的指针。
第2个参数condattr是指向属性对象的指针,该属性对象定义要初始化的条件变量的特性,如果该指针为NULL,则使用默认的属性。
默认属性初始化条件变量:

pthread_cond_init(&condition,NULL);

特定属性初始化条件变量:

pthread_condattr_t cattr;
pthread_cond_init(&condition,&cattr);

(3)销毁条件变量

int pthread_cond_destroy(pthread_cond_t* cond);

2.2)通知等待条件变量

通知等待条件变量的第一个线程:

int pthread_cond_signal(pthread_cond_t* cond);

通知等待条件变量的所以线程:

int pthread_cond_broadcast(pthread_cond_t* cond);

2.3)等待条件变量

阻塞等待某个条件变量:

int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);

第1个参数cond是指向要等待的条件变量的指针。
第2个参数mutex是指向与条件变量cond关联的互斥锁的指针。
在指定的时间范围内等待条件变量:

int pthread_cond_timedwait(pthread_cond_t* cond,pthread_mutex_t* mutex,strcut timespec* expiration);

第1个参数cond是指向要等待的条件变量的指针。
第2个参数mutex是指向与条件变量cond关联的互斥锁的指针。
第3个参数abstime是等待过期时的绝对时间,如果在此时间范围内取到该条件变量函数将返回。
// 以上两个函数都包含一个互斥锁,如果某线程因等待条件变量进入等待状态时,将隐含释放其申请的互斥锁,同样,在返回时,隐含申请到该互斥锁对象操作。

3)参考文献

《Linux高级程序设计》
《POSIX多线程程序设计》

你可能感兴趣的:(linux,operating,system)