c++通过atomic实现一个程序的单开,不通过单例模式实现,不通过std::atomic_flag实现。
时间: 2024-04-12 12:27:15 浏览: 155
单例模式 c++
通过使用`std::atomic`类模板,你可以实现一个原子操作来保证程序只能被单个线程执行。下面是一个示例代码:
```cpp
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<bool> isRunning(false); // 原子变量
void myFunction()
{
// 检查是否已经有线程在执行
if (isRunning.exchange(true))
{
std::cout << "程序已在运行中" << std::endl;
return;
}
// 执行你的程序逻辑
std::cout << "程序开始执行" << std::endl;
// 模拟程序执行时间
std::this_thread::sleep_for(std::chrono::seconds(5));
// 重置原子变量,允许其他线程再次执行
isRunning.store(false);
std::cout << "程序执行完毕" << std::endl;
}
int main()
{
std::thread t1(myFunction);
std::thread t2(myFunction);
t1.join();
t2.join();
return 0;
}
```
在上面的代码中,我们使用`std::atomic<bool>`来创建一个原子变量`isRunning`,用于表示程序是否正在运行。在`myFunction`函数中,我们首先使用`exchange`方法将`isRunning`设置为`true`,如果返回值为`true`,表示已经有其他线程正在执行该程序,直接返回。如果返回值为`false`,则表示没有其他线程在执行,可以继续执行程序逻辑。
当程序执行完毕后,我们使用`store`方法将`isRunning`重新设置为`false`,以允许其他线程再次执行。
在`main`函数中,我们创建了两个线程来同时执行`myFunction`函数,通过使用原子变量来保证只有一个线程能够成功执行程序逻辑。
请注意,这种方法只能保证程序在多线程环境下只被单个线程执行一次,但不能保证程序的单例性。如果你需要确保程序在整个进程生命周期内只被执行一次,你仍然需要使用单例模式。
阅读全文