多线程编程(1)- 信号量,互斥锁

去百度面试中被问了一些关于多线程编程的,以前没怎么接触过。。现在正好看一下。


(1)基础概念:


信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”
也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。在有些情况下两者可以互换。 

两者之间的区别: 

作用域 
信号量: 进程间或线程间(linux仅线程间) 
互斥锁: 线程间 

上锁时 
信号量: 只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value值加一。一句话,信号量的value>=0。 
互斥锁: 只要被锁住,其他任何线程都不可以访问被保护的资源。如果没有锁,获得资源成功,否则进行阻塞等待资源可用。一句话,线程互斥锁的vlaue可以为负数。 


(2)C++测试:

如果只用mutex,而不用cond的话无法保证先执行tr1,再执行tr2

#include <iostream>
#include <queue>
#include <pthread.h>
#include<unistd.h>
using namespace std;
int sum = 200;
int ex = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;

void *tr(void * args){
    pthread_t pid = pthread_self();
    int num = *((int *)args);
    int state = *((int *)args) * 10;
    while(1) {
        pthread_mutex_lock(&mutex);
        int send = 0;
        if(sum > 100){
            cout<<pid<<": "<< sum << " in "<<*((int *)args)<<endl;
            sum--;
        }
        else if(send == 0){
            pthread_cond_signal(&cond);
            //cout<<pid<<": "<<"send  in  "<<*((int *)args)<<endl;
            send = 1;
        }
        pthread_mutex_unlock(&mutex);
        if(sum == 0) break;
    }
}

void *tr2(void * args){
    pthread_t pid = pthread_self();
    int num = *((int *)args);
    int state = *((int *)args) * 10;
    while(1) {
        pthread_mutex_lock(&mutex);
        int send = 0;
        {
            pthread_cond_wait(&cond,&mutex);
            //cout<<pid<<": wait"<<endl;
        }
        {
            cout<<pid<<": "<< sum << " in "<<*((int *)args)<<endl;
            sum--;
        }
        pthread_mutex_unlock(&mutex);
        if(sum == 0) break;
    }
}


int main(){
    pthread_t id1,id2;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&cond,NULL);

    int ind = 1;
    int ret = pthread_create(&id1,&attr,tr,(void *)&ind);
    int ind2 = 2;
    int ret2 = pthread_create(&id2,&attr,tr2,(void *)&ind2);

    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
}


引用:

http://blog.csdn.net/hitwengqi/article/details/8015646
http://blog.chinaunix.net/uid-24612247-id-2305050.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值