如何测量线程通过条件变量所花费的时间?
How to measure the time it took for a thread to get past a condition variable?
我想模拟一个剧院预订系统,客户与操作员通信以在 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?
假设您正在为一个 Posix 兼容系统(如 Linux)编写,您可以在等待循环前后使用 clock_gettime()
,并从等待循环中减去开始时间end time 获取经过的时间。您需要使用挂钟,而不是 CPU 时钟。由于此函数将其结果放在 struct timespec
中,这是一个由两部分组成的值,因此减法并不简单(但也不是特别复杂):您需要考虑减去纳秒字段的结果负数。
CLOCK_REALTIME
和 CLOCK_MONOTONIC
之间的区别在于单调时钟不受与时间服务同步所需的主机时钟调整的影响。 (另一个区别是没有关于 CLOCK_MONOTONIC
返回的值代表什么日历的信息,因为它通常在系统启动时开始计数。但是,两个时间之间的差异是完全有意义的。)
我想模拟一个剧院预订系统,客户与操作员通信以在 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?
假设您正在为一个 Posix 兼容系统(如 Linux)编写,您可以在等待循环前后使用 clock_gettime()
,并从等待循环中减去开始时间end time 获取经过的时间。您需要使用挂钟,而不是 CPU 时钟。由于此函数将其结果放在 struct timespec
中,这是一个由两部分组成的值,因此减法并不简单(但也不是特别复杂):您需要考虑减去纳秒字段的结果负数。
CLOCK_REALTIME
和 CLOCK_MONOTONIC
之间的区别在于单调时钟不受与时间服务同步所需的主机时钟调整的影响。 (另一个区别是没有关于 CLOCK_MONOTONIC
返回的值代表什么日历的信息,因为它通常在系统启动时开始计数。但是,两个时间之间的差异是完全有意义的。)