• 互斥量互斥锁


    芹菜笔记: 

    调试小技巧:统计程序消耗的时间;

    互斥量:

    原子笔记 

    互斥锁初始化:

    pthread_mutex_init()函数对互斥锁进行初始化

    1. pthread_mutex_t mutex;
    2. pthread_mutex_init(&mutex, NULL);
    3. 或者:
    4. pthread_mutex_t *mutex = malloc(sizeof(pthread_mutex_t));
    5. pthread_mutex_init(mutex, NULL);

    互斥锁加锁和解锁


    pthread_mutex_lock()可以对互斥锁加锁、获取互斥锁;

    pthread_mutex_unlock()可以对互斥锁解锁、释放互斥锁;

    如果线程不希望被阻塞,可以使用 pthread_mutex_trylock()函数

    销毁互斥锁

    pthread_mutex_destroy()函数来销毁互斥锁

    • 不能销毁还没有解锁的互斥锁,否则将会出现错误;
    • 没有初始化的互斥锁也不能销毁

    互斥锁死锁

    1. // 线程 A
    2. pthread_mutex_lock(mutex1);
    3. pthread_mutex_lock(mutex2);
    4. // 线程 B
    5. pthread_mutex_lock(mutex2);
    6. pthread_mutex_lock(mutex1);

    互斥锁属性

    pthread_mutex_init()函数初始化互斥锁时可以设置互斥锁的属性
    pthread_mutexattr_destroy()将其销毁
    pthread_mutexattr_gettype()函数得到互斥锁类型属性,

    pthread_mutexattr_settype()修改/设置互斥锁类型属性, 

    1. pthread_mutex_t mutex;
    2. pthread_mutexattr_t attr;
    3. /* 初始化互斥锁属性对象 */
    4. pthread_mutexattr_init(&attr);
    5. /* 将类型属性设置为 PTHREAD_MUTEX_NORMAL */
    6. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
    7. /* 初始化互斥锁 */
    8. pthread_mutex_init(&mutex, &attr);
    9. ......
    10. /* 使用完之后 */
    11. pthread_mutexattr_destroy(&attr);
    12. pthread_mutex_destroy(&mutex);

    面试题:依次打印abcd

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <pthread.h>
    5. #include <unistd.h>
    6. #define THRNUM 4
    7. static pthread_mutex_t mut[THRNUM];
    8. static int next(int n)
    9. {
    10. if(n + 1 == THRNUM)
    11. return 0;
    12. return n + 1;
    13. }
    14. static void *thr_func(void *p)
    15. {
    16. int c;
    17. int n = (int)p;
    18. c = 'a' + n;
    19. while(1)
    20. {
    21. pthread_mutex_lock(mut+n);
    22. write(1, &c, 1);
    23. pthread_mutex_unlock(mut+next(n));
    24. }
    25. pthread_exit(NULL);
    26. }
    27. int main()
    28. {
    29. pthread_t tid[THRNUM];
    30. int i, err;
    31. for(i = 0; i < THRNUM; i++)
    32. {
    33. pthread_mutex_init(mut+i, NULL);
    34. pthread_mutex_lock(mut+i);
    35. err = pthread_create(tid+i, NULL, thr_func, (void *)i);
    36. if(err)
    37. {
    38. fprintf(stderr, "pthread_create():%s\n", strerror(err));
    39. exit(1);
    40. }
    41. }
    42. pthread_mutex_unlock(mut+0);
    43. alarm(2 );
    44. for(i = 0; i < THRNUM; i++)
    45. pthread_join(tid[i], NULL);
    46. exit(0);
    47. }
  • 相关阅读:
    2022/07/04学习记录
    基于RetinaFace的口罩人脸检测算法
    K8s bridge、ip分配原理
    CVE-2021-3490 eBPF 32位边界计算错误漏洞利用分析
    基于python的图书馆大数据可视化分析系统设计与实现
    P2918 [USACO08NOV] Buying Hay S(不一样的完全背包)
    为什么残差连接的网络结构更容易学习?
    计算机网络笔记1 概述
    【瑞吉外卖】day06:文件上传下载、菜品新增、菜品分页查询、菜品修改
    千变万化的Promise
  • 原文地址:https://blog.csdn.net/weixin_46432495/article/details/125465356