zoukankan      html  css  js  c++  java
  • Linux多线程同步方法

       在线程对共享相同内存操作时,就会出现多个线程对同一资源的使用,为此,需要对这些线程进行同步,以确保它们在访问共享内存的时候不会访问到无效的数值。
     
    以下是线程的几种同步方式:
    1、 互斥量。
           通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量从本质上讲是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。如下例所示,就是互斥量对共享数据的操作:
     
    #include <stdio.h>
    #include <pthread.h>
    int value = 5;//共享变量
    pthread_mutex_t mutex;//互斥变量
    void *mythread1();
    void mainshow();
    int main()
    {
        int retval;
        pthread_t tid1;
        retval = pthread_create(&tid1,NULL,mythread1,&value);//创建线程
        if(retval != 0){printf(“Can not create mythread1\n”);
        mainshow();
        retval = pthread_join(&tid1,NULL);//等待线程mythread1结束
        if(retval != 0){printf(“Can not join with mythread.\n”);
        printf(“value = %d\n”,value);
        return 0;
    }
    
    void *mythread1()
    {
          int retval;
          retval = pthread_mutex_lock(&mutex);//上锁
          value = value + 1;//对共享变量的操作
          printf("value = %d\n",value);
          retval = pthread_mutex_unlock(&mutex);//解锁
          pthread_exit((void *)0);
    }
     
    void myshow()
    {
          int retval;
          retval = pthread_mutex_lock(&mutex);//上锁
          value = value + 1;//对共享变量的操作
          printf(“value = %d\n”,value);
          pthread_mutex_unlock(&mutex);//解锁
    }


     
    2、信号量
           该信号量是Posix提供的基于内存的信号量,它们由应用程序分配信号量的内存空间。如下例所示,就是信号量对共享数据的操作:
     
    #include <stdio.h>
    #include <pthread.h>
    #include <semaphore.h>
    int value = 5;
    sem_t sem1,sem2;
    void mainshow();
    void *mythread();
    int main()
    {
           int retval;
           pthread_t tid;
           retval = sem_init(&sem1,0,0);
           retval = sem_init(&sem2,0,1);
           retval =pthread_create(&tid,NULL,mythread,NULL);
           mainshow();
           pthread_join(tid,NULL);
     
           printf("value3 = %d\n",value);
           return 0;
    }
     
    void *mythread()
    {
           int retval;
           retval = sem_wait(&sem1);
           value = value + 1;
           printf("value1 = %d\n",value);
           retval = sem_post(&sem2);
           pthread_exit((void *) 0);
    }
     
    void mainshow()
    {
           int retval;
           retval = sem_wait(&sem2);
           value = value + 1;
           printf("value2 = %d\n",value);
           retval = sem_post(&sem1);
    }


  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/jeakon/p/2816815.html
Copyright © 2011-2022 走看看