Linux线程-互斥锁pthread_mutex_t

来源:互联网 发布:耽美网络剧资源 编辑:程序博客网 时间:2024/06/05 02:19
在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁 的使用过程中,主要有 pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock 这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。互斥锁的范围:可以指定是该进程与其他进程的同步还是同一进程内不同的线程之间的同步。可以设置为PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默认是后者,表示进程内使用锁。
pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)
  • 互斥锁的类型:
    • PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。  
    • PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
    • PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
    • PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重

pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)示例:

#include <pthread.h>#include <stdio.h>pthread_mutex_t mutex ;void *print_msg(void *arg){        int i=0;        pthread_mutex_lock(&mutex);        for(i=0;i<15;i++){                printf("output : %d\n",i);                usleep(100);        }        pthread_mutex_unlock(&mutex);}int main(int argc,char** argv){        pthread_t id1;        pthread_t id2;        pthread_mutex_init(&mutex,NULL);        pthread_create(&id1,NULL,print_msg,NULL);        pthread_create(&id2,NULL,print_msg,NULL);        pthread_join(id1,NULL);        pthread_join(id2,NULL);        pthread_mutex_destroy(&mutex);        return 1;}
0 0
原创粉丝点击