zoukankan      html  css  js  c++  java
  • 线程同步

    有时候我们需要用到线程同步来控制线程运行顺序。

    /***
    synchro.c
    ***/
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<pthread.h>
    #include<errno.h>
    
    void *func(void *arg)
    {
        int threadno = *(int *)arg;
        int i = 0;
        for(; i < 10; i++)
        {
            printf("%d thread%d
    ",threadno,i);
            sleep(1);
        }
        return NULL;
    }
    
    int main()
    {
        pthread_t t1,t2;
        int i = 1,j = 2;
        pthread_create(&t1,NULL,func,&i);
        pthread_create(&t2,NULL,func,&j);
        
        pthread_join(t1,NULL);    
        pthread_join(t2,NULL);
    
        printf("main exit
    ");
        return EXIT_SUCCESS;
    }

    exbot@ubuntu:~/wangqinghe/thread/20190729$ ./synchro

    2 thread0

    1 thread0

    2 thread1

    1 thread1

    2 thread2

    1 thread2

    2 thread3

    1 thread3

    2 thread4

    1 thread4

    2 thread5

    1 thread5

    2 thread6

    1 thread6

    2 thread7

    1 thread7

    2 thread8

    1 thread8

    2 thread9

    1 thread9

    main exit

    线程1和线程2互相抢占资源。

    用互斥的方式来控制只有一个线程来使用资源。

    /***
    lock.c
    ***/
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<pthread.h>
    #include<errno.h>
    
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    void *func(void *arg)
    {
    
        pthread_mutex_lock(&mutex);    
    
        int threadno = *(int *)arg;
        int i = 0;
        for(; i < 10; i++)
        {
            printf("%d thread%d
    ",threadno,i);
            sleep(1);
        }
        pthread_mutex_unlock(&mutex);
        return NULL;
    }
    
    int main()
    {
        pthread_t t1,t2;
        int i = 1,j = 2;
        pthread_create(&t1,NULL,func,&i);
        pthread_create(&t2,NULL,func,&j);
        
        pthread_join(t1,NULL);    
        pthread_join(t2,NULL);
    
        printf("main exit
    ");
        return EXIT_SUCCESS;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/thread/20190729$ ./synchro1

    2 thread0

    2 thread1

    2 thread2

    2 thread3

    2 thread4

    2 thread5

    2 thread6

    2 thread7

    2 thread8

    2 thread9

    1 thread0

    1 thread1

    1 thread2

    1 thread3

    1 thread4

    1 thread5

    1 thread6

    1 thread7

    1 thread8

    1 thread9

    main exit

    线程2先进入后一直运行到任务结束,对mutex解锁后线程1才进入。

    PTHREAD_MUTEX_INITIALIZER 是初始化一个快速锁的宏定义。

    Pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER

    加锁解锁函数:

    int pthread_mutex_lock(&mutex);

    int pthread_mutex_unlock(&mutex);

  • 相关阅读:
    架构中的技术性解决难题
    设计一个js的架构第二篇
    DOCTYPE 严格模式与混杂模式
    架构中的技术性解决难题之解决篇
    css常用页面布局
    记录一个css的综合运用
    写在立春
    Win7重装后,如何删除cygwin目录?
    重读《The C Programming Language》
    [分享]多个选项卡切换效果
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11264658.html
Copyright © 2011-2022 走看看