1. Atomic.h // 原子操作接口封装,C++11已经实现 atomic 相关接口,更简洁些,推荐使用C++11内实现
std::atomic<std::int64_t> cur_max_sqlId_;
参考:https://zh.cppreference.com/w/cpp/atomic/atomic
2. CountDownLatch.h // 作类似于起跑线机制,值得学习一下
// latchdown之后然后调用wait.等待最后一个线程notifyAll
// 然后多个线程同时解除锁定就可以同时开始执行了
void CountDownLatch::wait()
{
MutexLockGuard lock(mutex_);
while (count_ > 0) {
condition_.wait();
}
}
// 每个线程启动成功后就执行latchdown,最后一个线程会notifyAll
void CountDownLatch::countDown()
{
MutexLockGuard lock(mutex_);
--count_;
if (count_ == 0) {
condition_.notifyAll();
}
}
通常用作,主线程等待几个工作线程启动,等工作线程全部完成初始化+启动后,countdown 通知主线程wait返回。
3. Singleton.h // 单例模式,实现很有特点
static T& instance()
{
pthread_once(&ponce_, &Singleton::init);
assert(value_ != NULL);
return *value_;
}
3. Thread.h // 线程封装,内置静态变量记录创建多少个线程。每个线程分配一个递增计数。内部计数用的还是Atomic.h里面的可以考虑换成C++11 提供的atomic接口了。
T get()
{
// in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)
return __sync_val_compare_and_swap(&value_, 0, 0);
}
T getAndAdd(T x)
{
// in gcc >= 4.7: __atomic_fetch_add(&value_, x, __ATOMIC_SEQ_CST)
return __sync_fetch_and_add(&value_, x);
}
4. ThreadPool.h 封装工作线程池。任务队列 std::deque<Task> queue_; typedef boost::function<void ()> Task;
// 外部丢入Task放到线程池内部
void ThreadPool::run(const Task& task)
{
if (threads_.empty()) // 如果没有任何线程
{
task();
}
else
{
MutexLockGuard lock(mutex_);
queue_.push_back(task);
cond_.notify();
}
}
ThreadPool::Task ThreadPool::take()
{
MutexLockGuard lock(mutex_);
while (queue_.empty() && running_)
{
cond_.wait();
}
Task task;
if(!queue_.empty())
{
task = queue_.front();
queue_.pop_front();
}
return task;
}
// 线程回调函数
void ThreadPool::runInThread()
{
try
{
while (running_)
{
Task task(take());
if (task)
{
task();
}
}
}
}