我想模拟一个剧院预订系统,在该系统中,客户与操作员进行通信以在C中预订座位。我正在使用pthread库。创建线程时,它将尝试获取包含可用运算符数量的变量的互斥量,并检查是否有任何运算符可用(使用条件变量),如果没有,则线程进入睡眠状态。我想知道线程与运算符连接所花费的时间,即线程经过条件变量所花费的时间。我是否可以仅在线程的开始并在条件变量之后使用计时器,否则将无法使用,因为当线程被阻塞时,计时器也被阻塞了吗?如果是这种情况,正确的方法是什么?谢谢。
void* thread_transaction(void* arg) //the function passed to
pthread_create
{
//instantiating variables and such...
//reserving an operator
pthread_mutex_lock(&tel_mut);
while(threadData->available_tel <= 0)
pthread_cond_wait(&tel_cond, &tel_mut);
//can I put a timer at the start and right here and accurately
//measure the time?
答案 0 :(得分:1)
假设您正在编写与Posix兼容的系统(例如Linux),则可以在等待循环之前和之后使用clock_gettime()
,然后从结束时间中减去开始时间以获得经过时间。您将要使用墙上时钟,而不是CPU时间时钟。由于此函数将其结果放置在struct timespec
中,该值是一个由两部分组成的值,因此减法并不是微不足道的(但也不是特别复杂):您需要考虑以下情况:将纳秒场相减会导致负数。
CLOCK_REALTIME
和CLOCK_MONOTONIC
之间的区别在于,单调时钟不受与时间服务同步所需的主机时钟调整的影响。 (另一个区别是,CLOCK_MONOTONIC
返回的值在日历方面没有什么表示,因为它通常在系统启动时开始计数。但是,两次之间的区别是完全有意义的。) / p>