| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /*
- * Copyright 2009-2017 Alibaba Cloud All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "Executor.h"
- #include <alibabacloud/core/Runnable.h>
- using namespace AlibabaCloud;
- Executor *Executor::self_ = nullptr;
- Executor::Executor() :
- cvMutex_(),
- shutdown_(true),
- tasksQueue_(),
- tasksQueueMutex_(),
- thread_()
- {
- self_ = this;
- }
- Executor::~Executor()
- {
- self_ = nullptr;
- shutdown();
- }
- Executor * Executor::instance()
- {
- return self_;
- }
- bool Executor::start()
- {
- if (!isShutdown())
- return true;
- auto threadMain = [this]()
- {
- while (!shutdown_)
- {
- while (!tasksQueue_.empty())
- {
- Runnable *task = nullptr;
- {
- std::lock_guard<std::mutex> lock(tasksQueueMutex_);
- if (!tasksQueue_.empty())
- {
- task = tasksQueue_.front();
- tasksQueue_.pop();
- }
- }
- if (task) {
- task->run();
- delete task;
- }
- }
- if (!shutdown_) {
- std::unique_lock<std::mutex> lk(cvMutex_);
- cv_.wait(lk);
- }
- }
- };
- shutdown_ = false;
- thread_ = std::thread(threadMain);
- return true;
- }
- bool Executor::isShutdown()const
- {
- return shutdown_;
- }
- void Executor::execute(Runnable* task)
- {
- if (isShutdown())
- return;
- std::lock_guard<std::mutex> locker(tasksQueueMutex_);
- tasksQueue_.push(task);
- wakeUp();
- }
- void Executor::wakeUp()
- {
- std::unique_lock<std::mutex> lk(cvMutex_);
- cv_.notify_one();
- }
- void Executor::shutdown()
- {
- if (isShutdown())
- return;
-
- {
- std::lock_guard<std::mutex> locker(tasksQueueMutex_);
- while (tasksQueue_.size() > 0) {
- auto task = tasksQueue_.front();
- delete task;
- tasksQueue_.pop();
- }
- }
- shutdown_ = true;
- wakeUp();
- if (thread_.joinable())
- thread_.join();
- }
|