返回信息流最近有看C++,想试试单例怎么写,然后上网搜了下,发现不像Java好像写法基本很统一。C++五花八门各种写法(并看不懂,然后关于同步问题,请问下各位老司机,有简单的类似于synchronized的办法么?
这是一条镜像帖。来源:北邮人论坛 / cpp / #92263同步于 2016/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]C++是否有Java类似于synchronized功能的关键字
bixiaopeng
2016/6/18镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
C++直到C++11才真的支持多线程。现在,等价的做法是mutex+lock_guard。
```cpp
#include <mutex>
#include <cstdio>
using namespace std;
mutex m;
int num;
void add(int delta) {
printf("I am going to add %d to num...\n", delta);
int old_value;
int new_value;
{
lock_guard<mutex> guard(m); // 上锁
old_value = num;
new_value = num + delta;
num = new_value;
} // 当guard离开作用域的时候,被析构,此时解锁。
printf("num changed from %d to %d\n", old_value, new_value);
}
```
关键就是那个lock_guard。
参见:http://en.cppreference.com/w/cpp/thread/mutex
【 在 nuanyangyang 的大作中提到: 】
: [md]
: C++直到C++11才真的支持多线程。现在,等价的做法是mutex+lock_guard。
: ```cpp
: ...................
原来如此!我说为啥之前看到的明明有你写的这种,还有一堆引了好多头文件的搞法。。。
你说真正支持,那之前的时候靠平台相关代码硬上么,还是?
【 在 bixiaopeng 的大作中提到: 】
: 原来如此!我说为啥之前看到的明明有你写的这种,还有一堆引了好多头文件的搞法。。。
: 你说真正支持,那之前的时候靠平台相关代码硬上么,还是?
没办法,那时候真的没有通用的方法。在unix-like平台上一般都用[POSIX Thread(pthread)](http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html)。windows有自己的[api](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684266(v=vs.85).aspx),但都是平台相关的。
当然,多线程和锁必须要编译器的支持!必须要编译器的支持!必须要编译器的支持!重要的事要说三遍。不能光靠库!不能光靠库!不能光靠库!重要的事要说三遍。所以gcc/g++有-pthread选项(不仅仅是链接选项-lpthread哦,这是编译选项)才能支持pthread。所以,其实编译器早就在支持了,只是接口是平台相关的,没有可移植的方法而已。
- Boost库做了好人,封装了跨平台的[mutex](http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html)
- Qt库也做了一回好人,封装出了可以跨平台的[QMutex类](http://doc.qt.io/qt-5/qmutex.html)
- Gtk的GLib也封装出了[gmutex](https://developer.gnome.org/glib/stable/glib-Threads.html)
- 就连古老的wxWidget都没有忘记封装出一个[wxMutex](http://docs.wxwidgets.org/trunk/classwx_mutex.html)
- 尼玛连SDL这个图形、游戏开发的库都有自己的[SDL_CreateMutex](https://wiki.libsdl.org/SDL_CreateMutex)
- 就连死都不承认C++11之前多线程都是“未定义行为”的muduo的开发者都自己把pthread封装了一下弄出了个[MutexLock类](https://github.com/chenshuo/muduo/blob/master/muduo/base/Mutex.h)
- 还有[xcache](http://xcache.lighttpd.net/browser/trunk/xcache/xc_mutex.c)
- 还有Google Chromium的[Lock和AutoUnlock](https://chromium.googlesource.com/chromium/chromium/+/master/base/synchronization/lock.h)其实我挺佩服Chromium的,在C++11出现之前,就封装出了一套atomic operation库,而且还有C++11的acquire-release语义(精神可嘉,但没有编译器配合,也只能是“尽最大努力”了,没有保障)
- 还有Mozilla Firefox的[mozilla::Mutex和下层的PRLock(可移植锁)](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/Namespace/Mozilla/Mutex)
- 还有Apache的[portable runtime](https://apr.apache.org/docs/apr/1.5/apr__thread__mutex_8h_source.html)
- 还有Nginx[在unix上的mutex](http://lxr.nginx.org/source/src/os/unix/ngx_thread_mutex.c)
- 还有UnrealEngine4的[FScopedLock](https://docs.unrealengine.com/latest/INT/API/Runtime/Core/HAL/FScopeLock/index.html)
壮观吧。
基本上,只要随便搜一个能在Windows和Linux上跑的C/C++的工程,基本上都能找到一个自己封装的Mutex。