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


  • 相关阅读:
    图片的使用
    对话框
    窗体
    浏览器与android移动端视频互播技术实现
    Arcengine实现创建网络数据集札记(三)
    Arcengine实现创建网络数据集札记(二)
    Arcengine实现创建网络数据集札记(一)
    2019年年初iOS招人心得笔记(附面试题)
    2019年,200道面试题打造最受企业欢迎的iOS程序猿!
    BAT面试总结——iOS开发高级工程师
  • 原文地址:https://www.cnblogs.com/jeakon/p/2816815.html
Copyright © 2020-2023  润新知