gpt4 book ai didi

c - pthread_mutex_trylock 和 pthread_mutex_unlock 导致段错误

转载 作者:行者123 更新时间:2023-11-30 15:58:27 25 4
gpt4 key购买 nike

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

// 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() 导致了段错误。

但是,这里的程序看起来无害,不是吗?

最佳答案

你忘了initialize your mutex using pthread_mutex_init() .

根据经验,使用未初始化的互斥体是导致程序崩溃的相当安全的选择。

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

编辑:关于 trylock/unlock 的快速评论;如果互斥体被锁定,您将得到EBUSY并解锁它,如果互斥体是空闲的,trylock将成功锁定它并且不会被解锁。换句话说,它将切换互斥体的锁定/解锁状态。真的如你所愿吗?

关于c - pthread_mutex_trylock 和 pthread_mutex_unlock 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com