当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-28

    本文导语:  几个重要的函数: #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_loc...

几个重要的函数:

#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.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 互斥锁的一个问题
  • 在下面这段代码中,如果对init方法只加synchronized关键字,则不能达到互斥的目的,还要再加上static关键字才能互斥,为什么?
  • 信号量和互斥锁有什么区别??
  • linux进程同步或互斥
  • 进程对串口读写时使用互斥机制吗?
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • 条件变量和互斥量区别
  • 信号量可以用于多进程多线程同时互斥不?
  • 多线程调用ioctl 应在哪进行互斥操作?
  • 关于用文件实现进程互斥的问题
  • 问个多线程网络服务程序的文件操作符的互斥问题
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 条件变量是不是一定要搭配互斥锁才能发挥作用?
  • 线程同步读取变量可不可以不用互斥锁
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 关于内核互斥体的问题
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 信号量互斥问题
  • 关于文件读些互斥的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3