• 线程1——互斥锁


    头文件

    #include <pthread.h>


    创建新线程函数

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);


    结束线程函数

    void pthread_exit(void *retval);


    等待线程结束:

    int pthread_join(pthread_t thread, void **retval);


    创建互斥锁
    pthread_mutex_t *mutex
    pthread_mutex_init(互斥锁指针,NULL)

    //线程互斥锁加锁
    int pthread_mutex_lock(pthread_mutex_t *mutex)

    //线程互斥锁解锁
    int pthread_mutex_unlock(pthread_mutex_t *mutex)

    //线程互斥锁销毁
    int pthread_mutex_distory(pthread_mutex_t *mutex)


    案例:分别用三个线程打出1-30报数

     1 #include <pthread.h>
     2 #include <stdio.h>
     3 #include <unistd.h>
     4 #include <stdlib.h>
     5 //声明三个新进程
     6 void* task1(void *arg);
     7 void* task2(void *arg);
     8 void* task3(void *arg);
     9 pthread_mutex_t lock;    //互斥锁指针
    10 static int buf[30]={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};
    11 
    12 
    13 
    14 int main(void)
    15 {
    16     int ret;
    17     
    18     //创建初始化互斥锁
    19     pthread_mutex_init(&lock,NULL);
    20     
    21     //声明三个指针,指向线程的id
    22     pthread_t tid1,tid2,tid3;
    23     //创建三个新线程,用刚才的指针,
    24     pthread_create(&tid1,NULL,task1,(void*)5);
    25     pthread_create(&tid2,NULL,task2,(void*)6);
    26     pthread_create(&tid3,NULL,task3,(void*)7);
    27     
    28     printf("Main thread
    ");
    29     //等待线程结束运行
    30     pthread_join(tid1,(void **)&ret);
    31     pthread_join(tid2,(void **)&ret);
    32     pthread_join(tid3,(void **)&ret);
    33     
    34     sleep(1);
    35     printf("New thread1 id:%ld
    ",tid1);
    36     printf("New thread2 id:%ld
    ",tid2);
    37     printf("New thread3 id:%ld
    ",tid3);
    38     
    39     //销毁互斥锁
    40     pthread_mutex_destroy(&lock);
    41     
    42 }
    43 
    44     int i = 0;
    45 
    46 void* task1(void *arg)
    47 {
    48     while(i<30){
    49     
    50     //上锁
    51     pthread_mutex_lock(&lock);
    52     printf("task1:%d
    ",buf[i]);
    53     i += 1;
    54     //解锁
    55     pthread_mutex_unlock(&lock);
    56     usleep(1);
    57     }
    58     pthread_exit(NULL);
    59 }
    60 
    61 
    62 void* task2(void *arg)
    63 {
    64     
    65     while(i<30)
    66     {
    67     
    68     //上锁
    69     pthread_mutex_lock(&lock);
    70     printf("task2:%d
    ",buf[i]);
    71     i += 1;
    72     //解锁
    73     pthread_mutex_unlock(&lock);
    74     usleep(1);
    75     }
    76     pthread_exit(NULL);
    77 }
    78 
    79 void* task3(void *arg)
    80 {
    81     
    82     while(i<30)
    83     {
    84     
    85     //上锁
    86     pthread_mutex_lock(&lock);
    87     printf("task3:%d
    ",buf[i]);
    88     i += 1;
    89     //解锁
    90     pthread_mutex_unlock(&lock);
    91     usleep(1);
    92     }
    93     pthread_exit(NULL);
    94 }

    上锁和解锁,要放在使用公共资源的前后,比如例中的 i 前后。

  • 相关阅读:
    利用本地浏览器远程服务器上的jupyter notebook
    解决IIS服务器Web访问提示输入密码
    IIS 配置
    override new 关键字的区别
    ASP.NET的网站的设计与优化
    山东人!
    远程连接SQL Server 2000服务器的解决方案
    对软件的新认识
    一个程序员成长的六个阶段
    优秀程序员应当具备的品质
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11671018.html
Copyright © 2020-2023  润新知