我正在尝试在我的32位汇编语言程序中使用pthread_mutex_timedlock
中的pthreads
函数。代码看起来如下:
struct timespec
.tv_sec dd ? ; time in seconds
.tv_nsec dd ? ; time is nano seconds
ends
;....
.time timespec ; the timespec structure
;....
; the code where pthread_mutex_timedlock is used
mov eax, [.timeout] ; the timeout in [ms]
mov ecx, 1000
cdq
div ecx ; the timeout in eax [s]
imul edx, 1000000 ; the remainder in edx [ns]
mov [.time.tv_sec], eax
mov [.time.tv_nsec], edx
lea eax, [.time]
cinvoke pthread_mutex_timedlock, [.ptrMutex], eax
test eax, eax
jnz .error
问题是pthread_mutex_timedlock
函数只有在立即解锁时才会锁定互斥锁。
如果此时锁定互斥锁,则函数pthread_mutex_timedlock
会立即返回ETIMEDOUT
错误,而不会等待超时,忽略timespec
结构中设置的值。
我做错了什么?
答案 0 :(得分:4)
pthread_mutex_timedlock()
的超时是绝对超时,而不是相对的 - 它会立即返回,因为超时值所代表的绝对时间早已过去。
如果你想要“从现在起N毫秒内超时”(相对超时),你需要用clock_gettime()
获取当前时间(指定CLOCK_REALTIME
时钟,因为这是时钟使用的时钟pthread_mutex_timedlock()
)然后将其偏移N毫秒并将结果传递给pthread_mutex_timedlock()
。