//////////////////////////////// *

pthread_mutex_t stop = PTHREAD_MUTEX_INITIALIZER;
int a = 1;

void* decrement(void* arg)
{
    pthread_mutex_trylock(&stop);
    if(a > 0) { a--; }
    cout << "Esecuzione thread tid" << endl;
    pthread_mutex_unlock(&stop);
    pthread_exit(NULL);
}

int main()
{
    pthread_t tid;

    pthread_attr_t tattr;
    pthread_attr_init(&tattr);
    pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);

    pthread_create(&tid, &tattr, decrement, NULL);

    pthread_mutex_lock(&stop);
    if(a > 0) { a--; }
    cout << "Esecuzione thread main" << endl;

    cout << a << endl;

    pthread_exit(NULL);
    return 0;
}


为什么与主线程分离的线程继续执行,而不是使用EBUSY返回到调用者?

最佳答案

Windows中没有特定于您的问题。您实际上误解了pthread_mutex_trylock()的工作方式。


http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html



  pthread_mutex_trylock()功能应等效于pthread_mutex_lock(),不同之处在于,如果当前由互斥锁引用的互斥对象被锁定(由任何线程(包括当前线程)锁定),则调用应立即返回。
  ...
  pthread_mutex_trylock()函数在以下情况下将失败:
  [EBUSY]
  无法获取该互斥锁,因为它已被锁定。


不是decrement线程,而是pthread_mutex_trylock()返回(可能返回)EBUSY(您没有检查...)

顺便说一句,decrement线程也有可能早于pthread_mutex_lock(&stop)线程中的main()完成其执行。这是完全不确定的。

09-25 19:56