提交 a0bbc896 编写于 作者: 独孤过's avatar 独孤过

v2.2.1 修复移动赋值运算符函数的资源泄漏问题

上级 818d7690
......@@ -89,6 +89,41 @@ bool Thread::Structure::getTask(TaskType& _task)
return static_cast<bool>(_task);
}
// 移动数据
auto Thread::move(Thread& _left, Thread&& _right) \
-> DataType
{
std::lock_guard leftLock(_left._mutex);
auto data = _left._data;
std::lock_guard rightLock(_right._mutex);
_left._data = std::move(_right._data);
return data;
}
// 销毁线程
void Thread::destroy(DataType&& _data)
{
if (!_data) return;
std::lock_guard lock(_data->_threadMutex);
using State = Structure::State;
if (_data->getState() == State::EMPTY)
return;
// 通知线程退出
_data->_condition.exit();
// 挂起直到线程退出
if (_data->_thread.joinable())
_data->_thread.join();
// 清空配置项
_data->_taskQueue = nullptr;
_data->_callback = nullptr;
_data->setState(State::EMPTY);
}
// 获取任务
bool Thread::getTask(DataType& _data)
{
......@@ -163,9 +198,10 @@ Thread& Thread::operator=(Thread&& _another)
{
if (&_another != this)
{
std::scoped_lock lock(this->_mutex, \
_another._mutex);
this->_data = std::move(_another._data);
auto data = move(*this, \
std::forward<Thread>(_another));
destroy(std::move(data));
}
return *this;
}
......@@ -212,30 +248,6 @@ bool Thread::create()
return true;
}
// 销毁线程
void Thread::destroy()
{
auto data = load();
if (!data) return;
std::lock_guard lock(data->_threadMutex);
using State = Structure::State;
if (data->getState() == State::EMPTY)
return;
// 通知线程退出
data->_condition.exit();
// 挂起直到线程退出
if (data->_thread.joinable())
data->_thread.join();
// 清空配置项
data->_taskQueue = nullptr;
data->_callback = nullptr;
data->setState(State::EMPTY);
}
// 配置任务队列与回调函数子
bool Thread::configure(const QueueType& _taskQueue, \
const Callback& _callback)
......
......@@ -3,7 +3,7 @@
* 语言标准:C++17
*
* 创建日期:2017年09月22日
* 更新日期:2023年01月14
* 更新日期:2023年02月07
*
* 摘要
* 1. 线程类Thread定义于此文件,实现于Thread.cpp。
......@@ -22,7 +22,7 @@
* 作者:许聪
* 邮箱:solifree@qq.com
*
* 版本:v2.2.0
* 版本:v2.2.1
* 变化
* v2.0.1
* 1.运用Condition的宽松策略,提升激活线程的效率。
......@@ -37,6 +37,8 @@
* 1.配置任务支持复制语义和移动语义。
* 2.解决线程在销毁又创建之时可能出现的状态错误问题。
* 3.判断获取的任务是否有效,以防止线程泄漏。
* v2.2.1
* 1.修复移动赋值运算符函数的资源泄漏问题。
*/
#pragma once
......@@ -80,6 +82,13 @@ private:
DataType _data;
private:
// 移动数据
static DataType move(Thread& _left, \
Thread&& _right);
// 销毁线程
static void destroy(DataType&& _data);
// 获取任务
static bool getTask(DataType& _data);
......@@ -134,7 +143,10 @@ public:
bool create();
// 销毁线程
void destroy();
void destroy()
{
destroy(load());
}
// 配置任务队列与回调函数子
bool configure(const QueueType& _taskQueue, \
......
......@@ -253,6 +253,18 @@ void ThreadPool::Proxy::clearTask()
_data->_taskQueue->clear();
}
// 移动数据
auto ThreadPool::move(ThreadPool& _left, \
ThreadPool&& _right) -> DataType
{
std::lock_guard leftLock(_left._mutex);
auto data = _left._data;
std::lock_guard rightLock(_right._mutex);
_left._data = std::move(_right._data);
return data;
}
// 创建线程池
void ThreadPool::create(DataType&& _data, SizeType _capacity)
{
......@@ -429,8 +441,10 @@ ThreadPool& ThreadPool::operator=(ThreadPool&& _another)
{
if (&_another != this)
{
std::scoped_lock lock(this->_mutex, _another._mutex);
this->_data = std::move(_another._data);
auto data = move(*this, \
std::forward<ThreadPool>(_another));
if (data) destroy(std::move(data));
}
return *this;
}
......
......@@ -3,7 +3,7 @@
* 语言标准:C++17
*
* 创建日期:2017年09月22日
* 更新日期:2023年02月01
* 更新日期:2023年02月07
*
* 摘要
* 1.线程池类ThreadPool定义于此文件,实现于ThreadPool.cpp。
......@@ -21,7 +21,7 @@
* 作者:许聪
* 邮箱:solifree@qq.com
*
* 版本:v2.2.0
* 版本:v2.2.1
* 变化
* v2.0.1
* 1.运用Condition的宽松策略,提升激活守护线程的性能。
......@@ -42,6 +42,8 @@
* v2.2.0
* 1.完善代码风格。
* 2.设置线程池容量函数返回合理值。
* v2.2.1
* 1.修复移动赋值运算符函数的资源泄漏问题。
*/
#pragma once
......@@ -78,6 +80,10 @@ private:
DataType _data;
private:
// 移动数据
static DataType move(ThreadPool& _left, \
ThreadPool&& _right);
// 创建线程池
static void create(DataType&& _data, \
SizeType _capacity);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册