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);
    }


  • 相关阅读:
    maven的安装步骤
    Sublime Text 3设置指南
    Eclipse 不同版本名称
    redis命令简单介绍
    redis简介与window安装:
    redis数据类型:String
    Mybatis-plus的使用步骤
    SpringgBoot父子工程的创建
    我的大学-易班
    IDEA:配置Tomcat并运行应用
  • 原文地址:https://www.cnblogs.com/jeakon/p/2816815.html
Copyright © 2011-2022 走看看