zoukankan      html  css  js  c++  java
  • Linux多线程及线程同步简单实例

    一、多线程基本概念

    1. 线程的基本概念

    ① 线程就是轻量级的进程

    ②线程和创建他的进程共享代码段、数据段

    ③线程拥有自己的栈

    2. 在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入互斥机制,而互斥锁(mutex)是互斥机制中的一种

    3. 简单实例

    #include <stdio.h>
    #include <pthread.h>
    
    pthread_t work1Id;
    pthread_t work2Id;
    
    int work1Ret = 1;
    int work2Ret = 2;
    
    pthread_mutex_t mutex;
    
    int number = 0;
    
    void* Work1(void* args)
    {
        int i = 0;
        
        printf("I am work%d
    ", *((int*)args));
        
        for(i = 0; i < 10; i++)
        {
            pthread_mutex_lock(&mutex);
            number++;
            pthread_mutex_unlock(&mutex);
            
            printf("I am work%d, number = %d
    ", *((int*)args), number);
            
            sleep(1);
        }
        
        return &work1Ret;
    }
    
    void* Work2(void* args)
    {
        int i = 0;
        
        printf("I am work%d
    ", *((int*)args));
        
        for(i = 0; i < 10; i++)
        {
            pthread_mutex_lock(&mutex);
            number++;
            pthread_mutex_unlock(&mutex);
            
            printf("I am work%d, number = %d
    ", *((int*)args), number);
            
            sleep(1);
        }
        
        return &work2Ret;
    }
    
    int main()
    {
        int args1 = 1;
        int args2 = 2;
        
        void* work1Ret = NULL;
        void* work2Ret = NULL; 
        
        pthread_mutex_init(&mutex, NULL);
        
        pthread_create(&work1Id, NULL, Work1, &args1);
        
        pthread_create(&work2Id, NULL, Work2, &args2);
        
        pthread_join(work1Id, &work1Ret);
        
        if(work1Ret != NULL)
        {
            printf("work1Ret = %d
    ", *((int*)work1Ret));
        }
        
        pthread_join(work2Id, &work2Ret);
        
        if(work2Ret != NULL)
        {
            printf("work2Ret = %d
    ", *((int*)work2Ret));
        }
        
        return 0;
    }

    二、线程同步

    1. 多个线程按照规定的顺序来执行,即为线程同步。

    2. 条件变量

    ①初始化

    pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

    ②等待条件成熟

    pthread_wait(&cond_ready, &mutex); //会对mutex先进行解锁操作

    ③设置成熟条件

    pthread_cond_signal(&cond_ready)

    3. 简单实例

    #include <stdio.h>
    #include <pthread.h>
    
    pthread_t work1Id;
    pthread_t work2Id;
    
    int work1Ret = 1;
    int work2Ret = 2;
    
    pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    int number = 0;
    
    void* Work1(void* args)
    {
        int i = 0;
        
        printf("I am work%d
    ", *((int*)args));
        
        for(i = 0; i < 10; i++)
        {
            pthread_mutex_lock(&mutex);
            number++;
            
            if(number >= 10)
            {
                printf("I am work%d, Finish
    ", *((int*)args));
                pthread_cond_signal(&cond_ready);
            }
            
            pthread_mutex_unlock(&mutex);
            
            printf("I am work%d, number = %d
    ", *((int*)args), number);
            
            sleep(1);
        }
        
        return &work1Ret;
    }
    
    void* Work2(void* args)
    {
        
        printf("I am work%d
    ", *((int*)args));
        pthread_mutex_lock(&mutex);
        
        if(number <= 10)
        {
            pthread_cond_wait(&cond_ready, &mutex);
            
            printf("I am work%d, number = %d
    ", *((int*)args), number);
        }
        
        return &work2Ret;
    }
    
    int main()
    {
        int args1 = 1;
        int args2 = 2;
        
        void* work1Ret = NULL;
        void* work2Ret = NULL; 
        
        pthread_create(&work1Id, NULL, Work1, &args1);
        
        pthread_create(&work2Id, NULL, Work2, &args2);
        
        pthread_join(work1Id, &work1Ret);
        
        if(work1Ret != NULL)
        {
            printf("work1Ret = %d
    ", *((int*)work1Ret));
        }
        
        pthread_join(work2Id, &work2Ret);
        
        if(work2Ret != NULL)
        {
            printf("work2Ret = %d
    ", *((int*)work2Ret));
        }
        
        return 0;
    }
  • 相关阅读:
    Intersecting Lines (计算几何基础+判断两直线的位置关系)
    Morley's Theorem (计算几何基础+向量点积、叉积、旋转、夹角等+两直线的交点)
    TOYS(计算几何基础+点与直线的位置关系)
    Berland National Library
    PAT L2-017. 人以群分
    6.9服务与主机之间的映射
    第六章 部署
    5.12.1再试一次
    第5章 分解单块系统
    4.14.6 —种混合方式
  • 原文地址:https://www.cnblogs.com/wulei0630/p/6668652.html
Copyright © 2011-2022 走看看