美文网首页
多线程互斥锁基本用法

多线程互斥锁基本用法

作者: heyzqq | 来源:发表于2018-01-18 20:32 被阅读0次

1、关于互斥锁的函数

// 初始化互斥锁。attr 一般为 NULL
// 静态初始化:pthread_mutex_t mymutex= PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr);
// 销毁互斥锁
int pthread_mutex_destroy (pthread_mutex_t * mutex);
// 加锁 - 阻塞
int pthread_mutex_lock (pthread_mutex_t * mutex );
// 解锁
int pthread_mutex_unlock (pthread_mutex_t * mutex );
// 加锁 - 非阻塞
int pthread_mutex_trylock (pthread_mutex_t * mutex );

2、静态实现

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* test(void *arg)
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)arg;

    printf("wait...\n");

    pthread_mutex_lock(mutex);  // 加锁

    printf("[test()] hello \n");

    pthread_mutex_unlock(mutex);  // 解锁

    pthread_exit((void *)0);
}

int main(void)
{
    pthread_t thread_id;

    // 静态分配:需要再声明的时候直接初始化,下面分开的做法是错误的
    // pthread_mutex_t mymutex;
    // mymutex= PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_t mymutex= PTHREAD_MUTEX_INITIALIZER;
    
    printf("[main()] main func !\n");
    
    pthread_mutex_lock(&mymutex);  // 加锁
    
    if (0 == pthread_create(&thread_id, NULL, (void *)test, (void *)(&mymutex))){
        printf("[main()] created thread~\n");
    }else{
        printf("[main()] create error\n");
    }
    
    sleep(1);
    
    printf("wait...\n");
    
    pthread_mutex_unlock(&mymutex);  // 解锁
    
    pthread_join(thread_id, NULL);   

    return 0;
}

输出如下,先创建线程,然后 wait,等 please wait... 完后主线程解锁,然后才 say hello:

[main()] main func !
[main()] created thread~
wait...
please wait...
[test()] hello 

3、动态实现,手动释放

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* test(void *arg)
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)arg;
    
    printf("wait...\n");

    pthread_mutex_lock(mutex);

    printf("[test()] hello \n");

    pthread_mutex_unlock(mutex);

    pthread_exit((void *)0);
}

int main(void)
{
    pthread_t thread_id;

    pthread_mutex_t mymutex;
    
    // 动态分配:需要手动释放
    pthread_mutex_init(&mymutex, NULL);
    
    printf("[main()] main func !\n");
    
    pthread_mutex_lock(&mymutex);
    
    if (0 == pthread_create(&thread_id, NULL, (void *)test, (void *)(&mymutex))){
        printf("[main()] created thread~\n");
    }else{
        printf("[main()] create error\n");
    }
    
    sleep(1);
    
    printf("please wait...\n");
    
    pthread_mutex_unlock(&mymutex);
    
    pthread_join(thread_id, NULL);
    
    // 手动释放
    pthread_mutex_destroy(&mymutex);    
   
    return 0;
}

4、还有很多情况,后面再慢慢了解

还有死锁问题.

PTHREAD_MUTEX_INITIALIZER // 创建快速互斥锁。 

PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP // 创建递归互斥锁。

PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP // 创建检错互斥锁

[reference]
[1] wtz1985. linux多线程学习(四)——互斥锁线程控制[M]. (2009年01月17日 21:24:00). http://blog.csdn.net/wtz1985/article/details/3819052

相关文章

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • 多线程互斥锁基本用法

    1、关于互斥锁的函数 2、静态实现 输出如下,先创建线程,然后 wait,等 please wait... 完后主...

  • 生产者消费者中条件变量的使用

    使用的层次说明 多线程同步互斥锁mutex,lock_guard和unique_lock用法原子操作...

  • iOS底层探索-多线程锁

    多线程的锁大致可分为两大类:互斥锁、自旋锁;也可以分为三类:互斥锁、自旋锁、读写锁。 一、互斥锁:互斥+同步(强调...

  • C链表

    互斥锁:链表用在多线程中保证顺序,多个线程会操作同一个链表,互斥锁保证多线程操作的安全,互斥锁分情况使用,链表并不...

  • C++11多线程互斥锁`mutex`,`unique_lock`

    C++11多线程互斥锁mutex,unique_lock,lock_guard 互斥锁   互斥锁是线程中常用的线...

  • ReentrantLock (独占锁、互斥锁)

    ReentrantLock 互斥锁(独占锁) 锁 我们知道锁的基本原理是,基于将多线程并行任务通过某一种机制实现线...

  • iOS面试题与核心基础之线程同步(锁,串行队列,信号量,@syn

    锁 iOS多线程锁有两类 自旋锁 和 互斥锁自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。资源已...

  • iOS中的锁

    锁 - 主要作用是保证多线程访问资源安全 锁的种类:基本的锁就包括了三类 自旋锁 互斥锁 读写锁其他的比如条件锁,...

  • Python多任务_线程

    简单使用 多线程共享全局变量-互斥锁

网友评论

      本文标题:多线程互斥锁基本用法

      本文链接:https://www.haomeiwen.com/subject/dqqgoxtx.html