Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Eterfree
ThreadPool
提交
a0bbc896
T
ThreadPool
项目概览
Eterfree
/
ThreadPool
9 个月 前同步成功
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
ThreadPool
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a0bbc896
编写于
2月 07, 2023
作者:
独孤过
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
v2.2.1 修复移动赋值运算符函数的资源泄漏问题
上级
818d7690
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
78 addition
and
34 deletion
+78
-34
src/Thread.cpp
src/Thread.cpp
+39
-27
src/Thread.h
src/Thread.h
+15
-3
src/ThreadPool.cpp
src/ThreadPool.cpp
+16
-2
src/ThreadPool.h
src/ThreadPool.h
+8
-2
未找到文件。
src/Thread.cpp
浏览文件 @
a0bbc896
...
...
@@ -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
)
...
...
src/Thread.h
浏览文件 @
a0bbc896
...
...
@@ -3,7 +3,7 @@
* 语言标准:C++17
*
* 创建日期:2017年09月22日
* 更新日期:2023年0
1月14
日
* 更新日期:2023年0
2月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
,
\
...
...
src/ThreadPool.cpp
浏览文件 @
a0bbc896
...
...
@@ -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
;
}
...
...
src/ThreadPool.h
浏览文件 @
a0bbc896
...
...
@@ -3,7 +3,7 @@
* 语言标准:C++17
*
* 创建日期:2017年09月22日
* 更新日期:2023年02月0
1
日
* 更新日期:2023年02月0
7
日
*
* 摘要
* 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录