pthread_mutex_timedlock使用Linux汇编语言

时间:2017-02-05 17:56:51

标签: c linux assembly pthreads

设置:

我正在尝试在我的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结构中设置的值。

问题:

我做错了什么?

1 个答案:

答案 0 :(得分:4)

pthread_mutex_timedlock()的超时是绝对超时,而不是相对的 - 它会立即返回,因为超时值所代表的绝对时间早已过去。

如果你想要“从现在起N毫秒内超时”(相对超时),你需要用clock_gettime()获取当前时间(指定CLOCK_REALTIME时钟,因为这是时钟使用的时钟pthread_mutex_timedlock())然后将其偏移N毫秒并将结果传递给pthread_mutex_timedlock()