当前位置:  技术问答>linux和unix

互斥锁和条件变量同步线程等待超时程序问题

    来源: 互联网  发布时间:2017-01-15

    本文导语:  /**************************************************************************************/ /*文件:pthread_cond.c                                         */ /*简介:互斥锁和条件变量同步线程等待超时程序                ...


/**************************************************************************************/
/*文件:pthread_cond.c                                         */
/*简介:互斥锁和条件变量同步线程等待超时程序                         */
/*************************************************************************************/
#include 
#include 
#include 
#include 
#include 


pthread_mutex_t count_lock;
pthread_cond_t count_ready;
int count;

void *decrement_count(void *arg)
{
int k = 3;
struct timeval t1;
gettimeofday(&t1);
struct timespec t;
t.tv_sec = 1 + t1.tv_sec; //设置等待的时间是1s
t.tv_nsec = t1.tv_usec * 1000;
        pthread_mutex_lock(&count_lock);
        printf("decrement:waitingn");
        /*等待满足条件,期间互斥量仍然可用*/
        while (count == 0)
                k = pthread_cond_timedwait(&count_ready, &count_lock, &t);
                //应该是等待超时自动运行下面的?怎么非要等到信号阿?
        printf("k = %d cout = %dn%sn", k, count , strerror(k));
        count = count - 1;
        printf("decrement:count = %dn",  count);
        pthread_mutex_unlock(&count_lock);
        pthread_exit(NULL);
}
void *increment_count(void *arg)
{
int k;
        pthread_mutex_lock(&count_lock);
        printf("increment:runningn");
         if ((k =sleep(10) )!= 0);
         {
         printf("%dn", k);
         //pthread_exit(NULL);
         } //这里程序怎么没停下来,还是往下面走啊?
        
        count = count + 1;
        /*通知线程条件已满足*/
        pthread_cond_signal(&count_ready);

        printf("increment:count = %dn",  count);
        pthread_mutex_unlock(&count_lock);
        pthread_exit(NULL);
}
int main()
{
        pthread_t tid1,tid2;
        count=0;
        pthread_mutex_init(&count_lock, NULL);
        pthread_cond_init(&count_ready, NULL);

        pthread_create(&tid1, NULL, decrement_count, NULL);
        sleep(1);
        pthread_create(&tid2, NULL, increment_count, NULL);
    //   /*等待decrement退出*/
        pthread_join(tid2, NULL);
       printf("decrement quitn");
        pthread_join(tid1, NULL);
        return 0;
}

等待超时,怎么还是原样运行啊?
这里程序怎么没停下来,还是往下面走啊?

结果:
[root@localhost work1]# ./1
decrement:waiting
increment:running
0
increment:count = 1
decrement quit
k = 110 cout = 1
Connection timed out
decrement:count = 0
[root@localhost work1]# 



|
补充一下:

while (count == 0)
                k = pthread_cond_timedwait(&count_ready, &count_lock, &t);

此时互斥锁count_lock不会被占用,此时increment_count才能得到互斥锁,只有increment_count释放了锁之后,decrement_count才能得到锁再继续执行。

|
1.decrease线程 count_lock加锁 --> 等待count_ready(解锁count_lock)
2.increase线程 count_lock加锁 --> count_ready通知 --> 解锁count_lock

直接等待count_lock,其他线程怎么工作

|
你的程序写的有点问题

|
程序编译不通过
error: too few arguments to function ‘int gettimeofday(timeval*, timezone*)’


    
 
 

您可能感兴趣的文章:

  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 信号量可以用于多进程多线程同时互斥不?
  • 问个多线程网络服务程序的文件操作符的互斥问题
  • 多线程调用ioctl 应在哪进行互斥操作?
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • 线程互斥问题 iis7站长之家
  • 线程里互斥和条件变量一起使用的问题,有点迷惑.
  • 线程互斥问题
  • Linux下多线程互斥问题
  • 线程中互斥量的使用问题
  • (菜鸟飞飞)问个关于线程互斥的问题
  • 关于Linux多线程互斥共享资源
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 很简单的多线程互斥,刚接触请教大家
  • 互斥量实现线程同步问题
  • 有了信号量以后,还要线程间的互斥锁,进程间的文件锁何用?
  • Linux线程管理必备:解析互斥量与条件变量的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 互斥锁的一个问题
  • 在下面这段代码中,如果对init方法只加synchronized关键字,则不能达到互斥的目的,还要再加上static关键字才能互斥,为什么?
  • wince程序防止创建多个实例实现互斥作用
  • 信号量和互斥锁有什么区别??
  • linux进程同步或互斥
  • 进程对串口读写时使用互斥机制吗?
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • 条件变量和互斥量区别
  • 关于用文件实现进程互斥的问题
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 条件变量是不是一定要搭配互斥锁才能发挥作用?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 关于内核互斥体的问题
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 信号量互斥问题
  • 关于文件读些互斥的问题
  • c语言实现程序互斥问题 急.....
  • 求助 程序中添加互斥锁代码后编译怎么通不过 ?
  • 请问Unix下的进程互斥是用什么实现的?
  • 管程如何实现互斥


  • 站内导航:


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

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

    浙ICP备11055608号-3