使用C++代码实例说明pthread_mutex_t是不可重入的,并提出解决方法
函数不可重入:函数运行被打断以后,不能恢复运行或运行结果不符合预期。
Linux下的pthread_mutex_t控制的代码区域默认是不可重入的。下面是一个使用C++代码演示pthread_mutex_t不可重入的例子:
#include <iostream>
#include <pthread.h>
pthread_mutex_t mutex;
void foo()
{
pthread_mutex_lock(&mutex);
std::cout << "Hello from foo!" << std::endl;
bar();
pthread_mutex_unlock(&mutex);
}
void bar()
{
pthread_mutex_lock(&mutex); // 尝试在同一线程中获取锁
std::cout << "Hello from bar!" << std::endl;
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_mutex_init(&mutex, NULL);
foo();
pthread_mutex_destroy(&mutex);
return 0;
}
在上面的代码中,函数foo()获取互斥锁并调用函数bar()。bar()尝试在同一线程中获取互斥锁,这就导致了死锁。
要解决这个问题,我们可以使用可重入锁。下面是一个使用C++代码演示可重入锁的例子:
#include <iostream>
#include <pthread.h>
pthread_mutex_t mutex;
void foo();
void bar()
{
pthread_mutex_lock(&mutex); // 再次获取锁
std::cout << "Hello from bar!" << std::endl;
pthread_mutex_unlock(&mutex);
}
void foo()
{
pthread_mutex_lock(&mutex);
std::cout << "Hello from foo!" << std::endl;
bar();
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &attr);
foo();
pthread_mutexattr_destroy(&attr);
pthread_mutex_destroy(&mutex);
return 0;
}
THREAD_MUTEX_RECURSIVE是递归锁。这意味着,如果线程在持有互斥锁的情况下再次请求该锁,则不会发生死锁,而是允许同一线程多次持有该锁。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?