pthread_mutex_trylock和pthread_mutex_unlock导致分段错误

时间:2012-03-17 19:01:43

标签: c pthreads

取消线程后,需要解锁互斥锁,以避免死锁。所以我设计了以下方法:

// file_a.c
pthread_attr_t attr;
...
rc2 = pthread_attr_init(&attr);
ERR_IF( rc2 != 0 );
rc2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ERR_IF( rc2 != 0 );
rc2 = pthread_create(&destroy_thread, &attr, destroy_expired_sessions, NULL);
ERR_IF( rc2 != 0 );
...
pthread_attr_destroy(&attr);

static void *destroy_expired_sessions(void *t)
{
    ...
    (void)t;

    pthread_cleanup_push(cleanup_handler, NULL);
    while (1)
    {
            ... // doing some work here

            sleep(min_timeout);
    }
    pthread_cleanup_pop(0);
}

static void cleanup_handler(void *arg)
{
    (void)arg;

    authSessionListMutexUnlock();
}

// file_b.c
typedef struct
{
    /** Mutex for using this structure. */
    pthread_mutex_t mutex;
    /** The list of Session nodes. */
    cList *list;
} SessionList;

SessionList *globalSessionList = NULL;

...

void authSessionListMutexUnlock()
{
    if (pthread_mutex_trylock(&globalSessionList->mutex) == EBUSY)
        pthread_mutex_unlock(&globalSessionList->mutex);
}

我在这里使用pthread_mutex_trylock()的原因是,如果互斥锁已在其他地方解锁,则避免第二个pthread_mutex_unlock()。

但是,pthread_mutex_trylock()和pthread_mutex_lock()会导致分段错误。

但是,这里的程序似乎无害,不是吗?

1 个答案:

答案 0 :(得分:1)

你忘了initialize your mutex using pthread_mutex_init()

根据经验,使用未初始化的互斥锁是一个相当安全的选择,可以让你的程序崩溃。

另一种选择是,如果您试图从另一个线程解锁互斥锁而不是锁定它。该操作的行为未定义。

编辑:快速评论trylock / unlock;如果互斥锁被锁定,你将获得EBUSY并解锁它,如果互斥锁是空闲的,trylock将成功锁定它并且它将不会被解锁。换句话说,它将切换互斥锁的锁定/解锁状态。那真的像你想的那样吗?