请给出一个C++线程安全的单例模式
时间: 2024-05-18 18:16:26 浏览: 158
要实现一个C语言的线程安全单例模式,可以使用双重检查锁定(double-checked locking)的方式。
```c
#include <pthread.h>
// 单例结构体
typedef struct {
// 单例数据
int data;
} Singleton;
// 声明全局单例指针
Singleton *singleton = NULL;
// 互斥锁,用于保护对单例的访问
pthread_mutex_t singleton_mutex;
Singleton* getSingleton() {
// 第一次检查,避免不必要的加锁
if (singleton == NULL) {
// 加锁
pthread_mutex_lock(&singleton_mutex);
// 第二次检查,防止多个线程同时创建单例
if (singleton == NULL) {
// 创建单例实例
singleton = (Singleton*)malloc(sizeof(Singleton));
singleton->data = 0;
}
// 解锁
pthread_mutex_unlock(&singleton_mutex);
}
return singleton;
}
```
上述代码中,使用了双重检查锁定的方式,在第一次检查时,如果发现singleton为空,则获取互斥锁并再次检查singleton是否为空。这样可以保证只有第一个进入且需要创建单例的线程会执行创建单例的代码。
需要注意的是,为了保证线程安全,使用了pthread库提供的互斥锁pthread_mutex_t来保护对单例的访问。在使用前需要先初始化互斥锁,并在不再使用时销毁互斥锁。
```c
// 初始化互斥锁
pthread_mutex_init(&singleton_mutex, NULL);
// 销毁互斥锁
pthread_mutex_destroy(&singleton_mutex);
```
这样就实现了一个线程安全的C语言单例模式。
阅读全文