• 【PTHREAD】线程互斥与同步之自旋锁


    1 自旋锁类型

    typedef volatile int pthread_spinlock_t;
    
    • 1

    2 初始化与销毁自旋锁

    int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
    int pthread_spin_destroy(pthread_spinlock_t *lock);
    
    • 1
    • 2
    • PTHREAD_PROCESS_PRIVATE
    • PTHREAD_PROCESS_SHARED

    3 自旋锁的加锁解锁

    int pthread_spin_lock(pthread_spinlock_t *lock);
    int pthread_spin_trylock(pthread_spinlock_t *lock);
    int pthread_spin_unlock(pthread_spinlock_t *lock);
    
    • 1
    • 2
    • 3

    4 案例:自旋锁的使用

    • 源码

      #include 
      #include 
      #include 
      #include 
      #include 
      
      pthread_spinlock_t spinlock;
      
      void *start_routine_01(void *ptr)
      {
          printf("子线程(%lu)开始运行...\n", pthread_self());
          for (size_t i = 0; i < 3; i++)
          {
              pthread_spin_lock(&spinlock);
              printf("子线程(%lu)进入自旋锁\n", pthread_self());
              sleep(1);
              printf("子线程(%lu)离开自旋锁\n", pthread_self());
              pthread_spin_unlock(&spinlock);
          }
          return (void*)"9999";
      }
      
      void *start_routine_02(void *ptr)
      {
          printf("子线程(%lu)开始运行...\n", pthread_self());
          for (size_t i = 0; i < 3; i++)
          {
              pthread_spin_lock(&spinlock);
              printf("子线程(%lu)进入自旋锁\n", pthread_self());
              sleep(1);
              printf("子线程(%lu)离开自旋锁\n", pthread_self());
              pthread_spin_unlock(&spinlock);
          }
          return (void*)"9999";
      }
      
      int main(int argc, char const *argv[])
      {
          printf("主线程(%lu)开始运行...\n", pthread_self());
      
          pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);
          
          pthread_t thread_id_01;
          pthread_create(&thread_id_01, NULL, start_routine_01, NULL);
      
          pthread_t thread_id_02;
          pthread_create(&thread_id_02, NULL, start_routine_02, NULL);
      
          pthread_join(thread_id_01, NULL);
          pthread_join(thread_id_02, NULL);
      
          pthread_spin_destroy(&spinlock);
          printf("主线程(%lu)即将退出...\n", pthread_self());
          exit(EXIT_SUCCESS);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
    • 输出

      主线程(139684168165184)开始运行…
      子线程(139684168161024)开始运行…
      子线程(139684168161024)进入自旋锁
      子线程(139684159768320)开始运行…
      子线程(139684168161024)离开自旋锁
      子线程(139684168161024)进入自旋锁
      子线程(139684168161024)离开自旋锁
      子线程(139684168161024)进入自旋锁
      子线程(139684168161024)离开自旋锁
      子线程(139684159768320)进入自旋锁
      子线程(139684159768320)离开自旋锁
      子线程(139684159768320)进入自旋锁
      子线程(139684159768320)离开自旋锁
      子线程(139684159768320)进入自旋锁
      子线程(139684159768320)离开自旋锁
      主线程(139684168165184)即将退出…

  • 相关阅读:
    解决Mysql和redis缓存不一致问题
    设计模式学习笔记(七)代理模式以及动态代理的实现
    Java基础之《netty(4)—NIO之Channel》
    14 使用Vue + el-form + rules实现图书信息录入功能实战
    设计模式-单例模式
    Java 知识点总结笔记(篇2)
    项目代码标准化
    h5兼容问题 复制粘贴移动端无法粘贴复制内容
    (2023|ICML,LLM,标记掩蔽,并行解码)Muse:使用掩蔽生成 Transformer 的文本到图像生成
    C# Onnx Yolov8 Detect 手势识别
  • 原文地址:https://blog.csdn.net/zhy29563/article/details/126670185