sleep/usleep和多线程锁的注意事项

本文介绍了一个OJ后台程序中主线程与子线程间的问题:如何合理地使用互斥锁(mutex)来避免线程间的死锁情况。通过调整解锁时机与睡眠函数的位置,解决了因线程调度导致的其他线程长期被阻塞的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个OJ后台程序,一个主线程隔500毫秒读取一次数据库把任务放入队列中,起了4个线程用于处理任务(主要是得到任务,然后去数据库里读提交上来的代码).

主线程

while(true){
pthrea_lock_mutex(&conn_mutex);//数据库连接的mutex
//..读数据库..把任务放入队列中..
usleep(500000);
pthread_unlock_mutex(&conn_mutex);
}


子线程

while(true){
//得到一个任务
//去数据库里读出提交的代码
pthread_mutex_lock(&conn_mutex);//阻塞在这里
//读代码
pthread_mutex_unlock(&conn_mutex);
}


发现如果把pthread_mutex_unlock放在usleep()函数后面的话,其他4个线程就一直阻塞在lock上.

查了下资料,原来当这个线程从usleep()醒来后,unlock掉mutex之后,线程调度程序并不会立即让其他线程去占有这个mutex,由于当前线程刚从还有剩余时间片,于是又得到了这个mutex,而其他的线程就没有机会得到这个mutex.

解决方法就是把usleep(500000)和pthread_unlock_mutex(&conn_mutex)换个位置

while(true){
pthrea_lock_mutex(&conn_mutex);//数据库连接的mutex
//..读数据库放入队列中..
pthread_unlock_mutex(&conn_mutex);
usleep(500000);
}
结论:不要持有一个mutex太久,特别是不能在sleep()的时候持有一个mutex

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值