Pthread - 互斥量(Mutex) 和 条件变量(Condition variable)

Pthread - 互斥量(Mutex) 和 条件变量(Condition variable)

Mutex

Mutex 全称 “mutual exclusion”,是一种实现线程同步的方法。
在访问共享资源时,Mutex 的作用如同一把“锁”。给定时间只有一个线程可以对 Mutex 加锁,其他线程必须等待当前线程解锁才能重新获取 Mutex。如此线程便可以依次访问共享资源。
通常Mutex 使用场景是多个线程访问全局变量(又被称作“critical section”),Mutex可以确保变量的最终值和单线程下操作结果保持一致。
Pthread 中 Mutex 的操作函数有:

pthread_mutexattr_init (attr)
thread_mutex_init (mutex,attr)
pthread_mutex_lock (mutex)
pthread_mutex_trylock (mutex)
pthread_mutex_unlock (mutex)
pthread_mutex_destroy (mutex)
pthread_mutexattr_destroy (attr)

其中pthread_mutexattr_init和pthread_mutexattr_destroy初始化和销毁 Mutex属性变量(pthread_mutexattr_t);pthread_mutex_init和pthread_mutex_destroy初始化和销毁互斥量(pthread_mutex_t); pthread_mutex_lock和 pthread_mutex_trylock尝试对 Mutex 加锁,不同之处在于前者在Mutex 已被其它线程获取会阻塞,而后者会立即返回一个“EBUSY”的错误码。pthread_mutex_unlock对 Mutex 解锁。

下面提供一个示例,程序实现两向量的点积:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    double *a;
    double *b;
    double sum;
    int veclen;
}DOTDATA;

#define NUMTHRDS 4
#define VECLEN 100

DOTDATA dotstr;
pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;


void *dotprod(void *arg)
{
    long offset = (long)arg;
    int len = dotstr.veclen;
    int start = offset*len;
    int end = start + len;
    double* x = dotstr.a;
    double* y = dotstr.b;

    printf("Thread %ld started...\n", offset);

    double mysum;
    mysum = 0;
    int i;
    for(i=start; i<end; ++i) {
        mysum += (x[i]*y[i]);
    }   

    pthread_mutex_lock(&mutexsum);
    dotstr.sum += mysum;    
    pthread_mutex_unlock(&mutexsum);

    pthread_exit((void*)0);
}


int main(int argc, char* argv[]) 
{
    double *a = (double*)malloc(NUMTHRDS*VECLEN*sizeof(double));
    double *b = (double*)malloc(NUMTHRDS*VECLEN*sizeof(double));

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值