0
A
回答
1
我偶然发现了这个老问题。 4年后,您的案例可能不再有趣,但我相信示例实现可能仍然有一定的价值。
与注释部分中声称DCLP被破坏相反,在C++ 11中这不再是真实的,因为它提供了必要的原子类型,操作和内存屏障。
这是一个最小的实现,不一定是boost
的实现。异常行为被忽略。
的my_call_once
的参数功能可以保证被称为不止一次和共享数据的线程之间的正确同步..就像真实的东西std::call_once
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
class my_once_flag {
std::mutex mtx;
std::atomic<bool> flg{false};
template<typename Func, typename... Args>
friend void my_call_once(my_once_flag&, Func&&, Args&&...);
};
template<typename Func, typename... Args>
void my_call_once(my_once_flag& flag, Func&& f, Args&&... args)
{
if (flag.flg.load(std::memory_order_acquire) == false)
{
std::lock_guard<std::mutex> lck{flag.mtx};
if (flag.flg.load(std::memory_order_relaxed) == true)
return;
std::forward<Func>(f)(std::forward<Args>(args)...);
flag.flg.store(true, std::memory_order_release);
}
}
void just_once(int i) { std::cout << "once " << i << std::endl; }
int main()
{
my_once_flag of;
std::thread {[&]{ my_call_once(of, just_once, 1); }}.join();
std::thread {[&]{ my_call_once(of, just_once, 2); }}.join();
}
相关问题
- 1. 双重检查锁定和单例模式
- 2. R· - 可能不正确执行双重检查锁定模式
- 3. 寻找测试来重现破碎的双重检查锁定
- 4. .NET中的双重检查锁定
- 5. ASP.NET线程 - 双重检查锁定
- 6. 在现代JVM中双重检查锁定
- 7. 在Delphi中实现双重检查锁定是否可能或合理?
- 8. 线程安全惰性初始化:静态vs std :: call_once vs双重检查锁定
- 9. 在双重锁定的锁定模式中获取屏障
- 10. 双重锁定锁定模式:是否损坏?
- 11. C检查类成员的双重检查锁定#
- 12. 使用双重检查锁定习惯用于单身模式是否最佳?
- 13. 双重检查和锁定模式在c + +(不是11)中工作?
- 14. 在这种情况下,'双重检查锁定模式'是否适合std :: mutex?
- 15. 在SQL中使用双重检查锁定的死锁
- 16. 保持“显而易见”的锁定检索或使用双重检查锁定?
- 17. 为什么使用单独的包装类实现此双重检查锁?
- 18. 双重锁定内存模型保证
- 19. Android中的双重锁定锁定
- 20. Enum单身人士与Singleton双重检查锁定
- 21. 如何使双重检查的锁定语法不再冗长?
- 22. Java双重检查锁定解决方案?
- 23. 解释竞态条件双重检查锁定
- 24. 对双重检查锁定的Java同步效果?
- 25. LazyReference与双重检查锁定和空处理
- 26. 外的顺序写的双重检查锁定
- 27. Ruby中的双重检查锁定安全吗?
- 28. 通过RMI实现观察者模式
- 29. 单双锁设计模式
- 30. 双重锁定 - 目标c
你知道“双重检查锁定模式”也是白搭? –
我不会POCO线程 –
问题是我需要在多线程环境中实现单例模式。我对双重检查锁定模式(及其低效率)和boost call_once做了一些分析。我不应该使用boost库。所以我需要一个实现。 –