pthread_cond_timedwait和互斥量问题,急~~~~~~~~~~~~~~

zyi1201 2010-10-31 10:20:38
主线程创建一个互斥量后,马上开始循环地 pthread_cond_timedwait ,可是一直都是timeout。求解!!!
下面的两段代码意思都一样,可是结果不同。Linux下的代码老是得不到我想要的效果,一直timeout。

windows代码


#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

HANDLE hMutex = NULL;
const int nWaitTime = 1000;
const int nSleepTime = 200;

int main()
{
hMutex = ::CreateMutex(0, FALSE, NULL);

while (true)
{
int nRet = ::WaitForSingleObject(hMutex, nWaitTime);
if (WAIT_OBJECT_0 == nRet)
{
printf("Succeed!\n");
}
else if (WAIT_TIMEOUT == nRet)
{
printf("Time Out!\n");
}
else if (WAIT_ABANDONED == nRet)
{
printf("Abandoned!\n");
}
else if (WAIT_FAILED == nRet)
{
printf("Failed!\n");
}
else
{
printf("other error!\n");
}

::Sleep(nSleepTime);

::ReleaseMutex(hMutex);
}


::CloseHandle(hMutex);

return 0;
}


Linux下代码

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

pthread_mutex_t g_mutex;
pthread_cond_t g_cond;

int main()
{
pthread_mutex_init(&g_mutex, NULL);

while (true)
{
struct timespec ts;
ts.tv_sec = time(NULL) + 2;
ts.tv_nsec = 0;

int nRet = 0;

pthread_mutex_lock(&g_mutex);

nRet = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);
if (nRet == 0)
{
printf("succeed!\n"); // 这边一直都进不来
}
else if (nRet == 110)
{
printf("time out!\n");
}
else
{
printf("timedwait error!\n");
}

pthread_mutex_unlock(&g_mutex);

pthread_cond_signal(&g_cond);

sleep(1);
}

return 0;
}
...全文
694 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
惬意 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qq120848369 的回复:]
C/C++ code
mutex_lock() //锁住检查共享变量value

while(value!=xxx) //发现value还没有达到想要的结果
{
//于是睡眠并释放互斥锁(允许其他线程/进程可以获取互斥锁修改共享拜纳凉value)
pthread_cond_wait(mutex);
// 被其他线程/进程唤醒,锁住互斥量,循环检查valu……
[/Quote]


讲解的很清楚了 +++++++++
惬意 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yutaooo 的回复:]
这样吧。我先简单描述一下pthread_cond_timedwait()函数的行为。

pthread_cond_timedwait()将调用本函数的线程,从运行队列中取出,放入等待队列。这意味着,当前线程从运行态进入挂起态。进入挂起态后,关键的问题是,什么时候才能再次运行。

对于pthread_cond_timedwait()来说,有两种情况会让线程再次运行。就是说,出等待队列,进入运……
[/Quote]


无懈可击 +++++++++++++++++++++++
chinawwj2003 2011-09-19
  • 打赏
  • 举报
回复
是不是要把事件转换为绝对时间啊?
qq120848369 2011-07-23
  • 打赏
  • 举报
回复
mutex_lock() //锁住检查共享变量value

while(value!=xxx) //发现value还没有达到想要的结果
{
//于是睡眠并释放互斥锁(允许其他线程/进程可以获取互斥锁修改共享拜纳凉value)
pthread_cond_wait(mutex);
// 被其他线程/进程唤醒,锁住互斥量,循环检查value==xxx是否成立
}

//value==xxx了,于是可以对共享变量value做一些事情,此时仍然锁住互斥量,因为value是共享的

mutex_unlock() //修改完毕,释放互斥量


都是这个样子用的。
qq120848369 2011-07-23
  • 打赏
  • 举报
回复
互斥锁是为了检查共享变量的,条件变量是发现共享变量不符合标准于是投入睡眠的。

可以唤醒条件变量,于是互斥锁再次被获得并检查共享变量是否符合标准,不符合则继续睡在条件变量上。


经典的一句话:互斥锁时为了临界区访问的,条件变量是为了等待的。
  • 打赏
  • 举报
回复
学习一下···
yao0000008 2011-07-21
  • 打赏
  • 举报
回复
学习中···
yutaooo 2010-11-06
  • 打赏
  • 举报
回复

这样吧。我先简单描述一下pthread_cond_timedwait()函数的行为。

pthread_cond_timedwait()将调用本函数的线程,从运行队列中取出,放入等待队列。这意味着,当前线程从运行态进入挂起态。进入挂起态后,关键的问题是,什么时候才能再次运行。

对于pthread_cond_timedwait()来说,有两种情况会让线程再次运行。就是说,出等待队列,进入运行队列。
1. 超时。这也是timedwait所提示的。
2. 有另一个线程调用了pthread_cond_signal() pthread_cond_broadcast()函数,进行了通知。注意,本线程是没有条件调用pthread_cond_signal()的。因为,本线程正处于挂起状态,正在休眠呢。所以一定是其他的某个正在活动的线程发起了通知。

前面说的是,pthread_cond_timedwait()会将本线程置入休眠状态。问题是,什么时候应该休眠,什么时候应该继续执行。等价于,什么时候应该调用pthread_cond_timedwait(),而什么时候应该分支绕过这个调用,继续运行。

这就依赖条件。条件就是某个状态。比如,缓冲区到达上限,就不应该向缓冲区中写入。通常,有一个记录缓冲区当前用量的值,比如g_count。它显然会被各个写入,读出线程共享使用。既然共享,就需要保护。因此,用pthread_mutex_lock() 与pthread_cond_timedwait()对,来保护。保护什么?是保护g_count在各个线程中的互斥访问。

要更好的理解互斥量在这里的作用,要理解,pthread_cond_timedwait()在进入等待队列后,会将锁释放。在得到通知后,会将锁锁上。
zyi1201 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yutaooo 的回复:]
你对pthread_cond_t理解错了。昨天看到帖子就没敢回。
pthread_cond_t本身不是条件。而是用来提供一种机制:保护条件检测,适当的挂起线程,及时的唤醒。

C/C++ code


pthread_mutex_lock(&g_mutex);
/*
这两个函数之间的窗口,由这两个函数来保护。
加锁是为了原子访问,用于条件检测的变量。
比如:
……
[/Quote]

还是不太懂。
lgch123456 2010-11-03
  • 打赏
  • 举报
回复
主线程可以自己给
yutaooo 2010-11-01
  • 打赏
  • 举报
回复

你对pthread_cond_t理解错了。昨天看到帖子就没敢回。
pthread_cond_t本身不是条件。而是用来提供一种机制:保护条件检测,适当的挂起线程,及时的唤醒。



pthread_mutex_lock(&g_mutex);
/*
这两个函数之间的窗口,由这两个函数来保护。
加锁是为了原子访问,用于条件检测的变量。
比如:
while (g_count == 0) { // 这个才是条件
*/
nRet = pthread_cond_timedwait(&g_cond, &g_mutex, &ts);
/*
}
*/
zyi1201 2010-11-01
  • 打赏
  • 举报
回复
还有一个问题:
pthread_cond_timedwait 不是应该只关心第一个参数那个条件变量,那为什么还要传一个互斥量进去呢?这个互斥量前不是已经lock了吗?
zyi1201 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]

你的程序中只有一个线程啊,调用pthread_cond_timedwait时,没有别人给它pthread_cond_signal
它就超时了..
[/Quote]

这个方法我知道,可是除了多开一线程调用pthread_cond_signal的方法,可还有其他的方法没有???
zsjay758 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]
你的程序中只有一个线程啊,调用pthread_cond_timedwait时,没有别人给它pthread_cond_signal
它就超时了..
[/Quote]
+1
justkk 2010-11-01
  • 打赏
  • 举报
回复
你的程序中只有一个线程啊,调用pthread_cond_timedwait时,没有别人给它pthread_cond_signal
它就超时了..
justkk 2010-11-01
  • 打赏
  • 举报
回复
没有别的办法了吧
必须有人给他pthread_cond_signal
他自己在等待的时候又没法给自己pthread_cond_signal
zyi1201 2010-11-01
  • 打赏
  • 举报
回复
顶上去,求答案。

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧