zoukankan      html  css  js  c++  java
  • pthread 线程锁和条件锁

    静态初始化互斥锁,方法如下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

    动态方式是采用pthread_mutex_init()函数来初始化互斥锁,API定义如下:   int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

    pthread_mutex_lock( pthread_mutex_t *mutex) :

    pthread_mutex_unlock( pthread_mutex_t *mutex);

    pthread_mutex_trylock( pthread_mutex_t *mutex);  非阻塞调用模式

    int pthread_join(pthread_t thread, void **retval); 线程阻塞函数

    void pthread_exit(void *retval); 结束现场返回 ,通过retval

    条件锁:

    pthread_cond_t condmutex = PTHREAD_COND_INITIALIZER;

    pthread_cond_wait( &condmutex, &mutex);   此函数是阻塞函数,调用前后锁都是锁住的,阻塞过程中函数会打开锁,

      pthread_cond_signal(&cond); 发送信号前锁必须是开的,否则无法跳出阻塞。

    /*
     * 1p.c
     *
     *  Created on: Jan 18, 2017
     *      Author: s
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    #include <pthread.h>
    
        unsigned count = 0;
        pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
        pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;
    
    void decrement_count() {
        pthread_mutex_lock (&count_lock);
        sleep(1);
        //while(count==0)
            pthread_cond_wait( &cond, &count_lock);
    
        count=count -1;
        pthread_mutex_unlock (&count_lock);
        printf("decrement done,count = %d
    ",count);
    }
    
    void increment_count(){
        pthread_mutex_lock(&count_lock);
    
        if(count==0)
           // pthread_cond_signal(&cond);
    
        count=count+1;
        pthread_mutex_unlock(&count_lock);
        printf("increment done.count = %d
    ",count);
    }
    void test()
    {
        sleep(5);
        pthread_mutex_lock(&count_lock);
    
        printf("sleep 5s 
    ");
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&count_lock);
    }
    
    int main()
    {
    
    
        pthread_t idone,idtwo,id3;
        int ret;
        ret=pthread_create(&idone,NULL,(void *) decrement_count,NULL);
        if(ret!=0){
        printf ("Create pthread 1 error!/n");
        exit (1);
        }
    
        ret=pthread_create(&idtwo,NULL,(void *) increment_count,NULL);
        if(ret!=0){
        printf ("Create pthread 2 error!/n");
        exit (1);
        }
    
        ret=pthread_create(&id3,NULL,(void *) test,NULL);
        if(ret!=0){
        printf ("Create pthread 3 error!/n");
        exit (1);
        }
    
        printf("count = %d
    ",count);
        printf(" exec: pthread_join(idone,NULL); 
     ");
        pthread_join(idone,NULL);
        pthread_join(idtwo,NULL);
        pthread_join(id3,NULL);
    
        printf("done
    ");
        return 0;
    }

    对共享资源操作前一定要获得锁.

    完成操作以后一定要释放锁.

    尽量短时间地占用锁.

    如果有多锁, 如获得顺序是ABC连环扣, 释放顺序也应该是ABC.

    线程错误返回时应该释放它所获得的锁

  • 相关阅读:
    测试用户网速办法
    JS 判断后端返回的对象是否为空
    优美地低于生活——读书笔记
    vue login.js登录逻辑
    vuex store index.js配置登录
    vue router的 index.js设置
    css 添加校验时的必填项前面的红色的*
    vue 的 main.js 设置
    vue.config.js配置
    vim的使用
  • 原文地址:https://www.cnblogs.com/csun/p/6297729.html
Copyright © 2011-2022 走看看