栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

互斥量mutex的简单使用(实例讲解)

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

互斥量mutex的简单使用(实例讲解)

几个重要的函数:

#include

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr);    //初始化mutex

int pthread_mutex_destroy(pthread_mutex_t *mutex);  //如果mutex是动态分配的,则释放内存前调用此函数。

int pthread_mutex_lock(pthread_mutex_t *mutex);    //加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex);  //若已有其他线程占用锁,则返回EBUSY,否则返回0,不阻塞。

int pthread_mutex_unlock(pthread_mutex_t *mutex);   //解锁

例程:
复制代码 代码如下:
#include
#include
#include
#include
#include

int a = 100;
int b = 200;

pthread_mutex_t lock;

void * threadA()
{
    pthread_mutex_lock(&lock);
    printf("thread A got lock!n");
    a -= 50;
    sleep(3);        //如果不加锁,threadB输出会是50和200
    b += 50;        //加锁后会sleep 3秒后,并为b加上50 threadB才能打印
    pthread_mutex_unlock(&lock);
    printf("thread A released the lock!n");
    a -= 50;
}

void * threadC()
{   
    sleep(1);
    while(pthread_mutex_trylock(&lock) == EBUSY) //轮询直到获得锁
    {
        printf("thread C is trying to get lock!n");
        usleep(100000);
    }
    printf("thread C got the lock!n");
    a = 1000;
    b = 2000;
    pthread_mutex_unlock(&lock);
    printf("thread C released the lock!n");

}

void * threadB()
{
    sleep(2);                //让threadA能先执行
    pthread_mutex_lock(&lock);
    printf("thread B got the lock! a=%d b=%dn", a, b);
    pthread_mutex_unlock(&lock);
    printf("thread B released the lock!n", a, b);
}

int main()
{
    pthread_t tida, tidb, tidc;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&tida, NULL, threadA, NULL);
    pthread_create(&tidb, NULL, threadB, NULL);
    pthread_create(&tidc, NULL, threadC, NULL);
    pthread_join(tida, NULL);
    pthread_join(tidb, NULL);
    pthread_join(tidc, NULL);
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/126652.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号