Linux多线程编程学习(2)

线程同步的三种方式:

1、互斥量

   互斥量用pthread_mutex_t数据类型来表示。

    两种方式初始化,第一种:赋值为常量PTHREAD_MUTEX_INITIALIZER;第二种,当互斥量为动态分配是,使用pthread_mutex_init函数进行初始化,使用pthread_mutex_destroy函数销毁。

  

#include<pthread.h>    int pthread_mutex_init (pthread_mutex_t *__mutex,                      __const pthread_mutexattr_t *__mutexattr);   int pthread_mutex_destroy (pthread_mutex_t *__mutex);  

返回值:成功-0,失败-错误编号

 加解锁

加锁调用pthread_mutex_lock,解锁调用pthread_mutex_unlock。

#include<pthread.h>    int pthread_mutex_lock (pthread_mutex_t *__mutex);   int pthread_mutex_unlock (pthread_mutex_t *__mutex);  

使用互斥量修改上一个程序(修改部分用红色标出):

pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;
void *add(void *arg) {
    int i = 0,tmp;
    for (; i <500; i++)
    {
        pthread_mutex_lock(&mylock);
        tmp=num+1;
        num=tmp;
        printf("+1,result is:%d\n",num);
        pthread_mutex_unlock(&mylock);
    }
    return ((void *)0);
}
void *sub(void *arg)
{
    int i=0,tmp;
    for(;i<500;i++)
    {
        pthread_mutex_lock(&mylock);
        tmp=num-1;
        num=tmp;
        printf("-1,result is:%d\n",num);
        pthread_mutex_unlock(&mylock);
    }
    return ((void *)0);
}

2、读写锁   允许多个线程同时读,只能有一个线程同时写。适用于读的次数远大于写的情况。

  读写锁初始化:

  

#include<pthread.h>    int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,                   __const pthread_rwlockattr_t *__restrict                   __attr);   int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock);  

返回值:成功--0,失败-错误编号


 加锁,这里分为读加锁和写加锁。


读加锁:

int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)  

写加锁

int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock)  

解锁用同一个函数

int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock)  

3、条件变量

条件变量用pthread_cond_t数据类型表示。

条件变量本身由互斥量保护,所以在改变条件状态前必须锁住互斥量。


条件变量初始化:


第一种,赋值常量PTHREAD_COND_INITIALIZER;第二种,使用pthread_cond_init函数

int pthread_cond_init (pthread_cond_t *__restrict __cond,                     __const pthread_condattr_t *__restrict                     __cond_attr);   int pthread_cond_destroy (pthread_cond_t *__cond);  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppsff.html