Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Eterfree
ThreadPool
提交
a071ba8b
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,发现更多精彩内容 >>
提交
a071ba8b
编写于
12月 02, 2023
作者:
独孤过
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update v2.3.0
上级
c176a1f1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
21 addition
and
20 deletion
+21
-20
Source/Condition.hpp
Source/Condition.hpp
+11
-10
Source/Thread.cpp
Source/Thread.cpp
+2
-2
Source/ThreadPool.cpp
Source/ThreadPool.cpp
+8
-8
未找到文件。
Source/Condition.hpp
浏览文件 @
a071ba8b
...
...
@@ -47,13 +47,14 @@ template <typename _Size = std::size_t>
class
Condition
final
{
public:
enum
class
Strateg
y
:
std
::
uint8_t
enum
class
Polic
y
:
std
::
uint8_t
{
STRICT
,
RELAXED
};
public:
using
Size
=
_Size
;
using
Strategy
=
Policy
;
private:
std
::
mutex
_mutex
;
...
...
@@ -83,11 +84,11 @@ public:
void
exit
();
void
notify_one
(
Strategy
_strategy
=
Strateg
y
::
STRICT
);
void
notify_one
(
Policy
_policy
=
Polic
y
::
STRICT
);
void
notify_all
(
Strategy
_strategy
=
Strateg
y
::
STRICT
);
void
notify_all
(
Policy
_policy
=
Polic
y
::
STRICT
);
void
notify
(
Size
_size
,
Strategy
_strategy
=
Strateg
y
::
STRICT
);
void
notify
(
Size
_size
,
Policy
_policy
=
Polic
y
::
STRICT
);
template
<
typename
_Predicate
>
void
notify_one
(
_Predicate
_predicate
);
...
...
@@ -132,29 +133,29 @@ void Condition<_Size>::exit()
}
template
<
typename
_Size
>
void
Condition
<
_Size
>::
notify_one
(
Strategy
_strateg
y
)
void
Condition
<
_Size
>::
notify_one
(
Policy
_polic
y
)
{
std
::
unique_lock
lock
(
_mutex
);
if
(
_
strategy
==
Strateg
y
::
RELAXED
)
lock
.
unlock
();
if
(
_
policy
==
Polic
y
::
RELAXED
)
lock
.
unlock
();
_condition
.
notify_one
();
}
template
<
typename
_Size
>
void
Condition
<
_Size
>::
notify_all
(
Strategy
_strateg
y
)
void
Condition
<
_Size
>::
notify_all
(
Policy
_polic
y
)
{
std
::
unique_lock
lock
(
_mutex
);
if
(
_
strategy
==
Strateg
y
::
RELAXED
)
lock
.
unlock
();
if
(
_
policy
==
Polic
y
::
RELAXED
)
lock
.
unlock
();
_condition
.
notify_all
();
}
template
<
typename
_Size
>
void
Condition
<
_Size
>::
notify
(
Size
_size
,
\
Strategy
_strateg
y
)
Policy
_polic
y
)
{
std
::
unique_lock
lock
(
_mutex
);
if
(
_
strategy
==
Strateg
y
::
RELAXED
)
if
(
_
policy
==
Polic
y
::
RELAXED
)
lock
.
unlock
();
for
(
decltype
(
_size
)
index
=
0
;
\
...
...
Source/Thread.cpp
浏览文件 @
a071ba8b
...
...
@@ -341,8 +341,8 @@ bool Thread::configure(TaskType&& _task, \
// 激活线程
bool
Thread
::
notify
()
{
using
Policy
=
Condition
<>::
Policy
;
using
State
=
Structure
::
State
;
using
Strategy
=
Condition
<>::
Strategy
;
auto
data
=
load
();
if
(
!
data
)
...
...
@@ -360,7 +360,7 @@ bool Thread::notify()
if
(
state
!=
State
::
RUNNABLE
)
return
false
;
data
->
_condition
.
notify_one
(
Strateg
y
::
RELAXED
);
data
->
_condition
.
notify_one
(
Polic
y
::
RELAXED
);
return
true
;
}
...
...
Source/ThreadPool.cpp
浏览文件 @
a071ba8b
...
...
@@ -142,7 +142,7 @@ void ThreadPool::Structure::setCapacity(SizeType _capacity, \
auto
capacity
=
this
->
_capacity
.
exchange
(
_capacity
,
\
std
::
memory_order_relaxed
);
if
(
_notified
&&
capacity
!=
_capacity
)
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
}
// 放入任务
...
...
@@ -151,7 +151,7 @@ bool ThreadPool::Structure::pushTask(const TaskType& _task)
// 若放入任务之前,任务队列为空,则通知守护线程
auto
result
=
_taskQueue
->
push
(
_task
);
if
(
result
&&
result
.
value
()
==
0
)
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
return
result
.
has_value
();
}
...
...
@@ -161,7 +161,7 @@ bool ThreadPool::Structure::pushTask(TaskType&& _task)
// 若放入任务之前,任务队列为空,则通知守护线程
auto
result
=
_taskQueue
->
push
(
std
::
forward
<
TaskType
>
(
_task
));
if
(
result
&&
result
.
value
()
==
0
)
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
return
result
.
has_value
();
}
...
...
@@ -174,7 +174,7 @@ bool ThreadPool::Structure::pushTask(TaskQueue& _taskQueue)
// 若放入任务之前,任务队列为空,则通知守护线程
auto
result
=
this
->
_taskQueue
->
push
(
_taskQueue
);
if
(
result
&&
result
.
value
()
==
0
)
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
return
result
.
has_value
();
}
...
...
@@ -187,7 +187,7 @@ bool ThreadPool::Structure::pushTask(TaskQueue&& _taskQueue)
// 若放入任务之前,任务队列为空,则通知守护线程
auto
result
=
this
->
_taskQueue
->
push
(
std
::
forward
<
TaskQueue
>
(
_taskQueue
));
if
(
result
&&
result
.
value
()
==
0
)
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
return
result
.
has_value
();
}
...
...
@@ -294,7 +294,7 @@ void ThreadPool::create(DataType&& _data, SizeType _capacity)
if
(
auto
data
=
_data
.
lock
();
data
\
&&
(
data
->
setIdleSize
(
1
,
Arithmetic
::
INCREASE
)
==
0
\
||
data
->
getIdleSize
()
>=
data
->
getTotalSize
()))
data
->
_condition
.
notify_one
(
Condition
<>::
Strateg
y
::
RELAXED
);
data
->
_condition
.
notify_one
(
Condition
<>::
Polic
y
::
RELAXED
);
};
// 初始化线程并放入线程表
...
...
@@ -321,7 +321,7 @@ void ThreadPool::create(DataType&& _data, SizeType _capacity)
void
ThreadPool
::
destroy
(
DataType
&&
_data
)
{
using
Arithmetic
=
Structure
::
Arithmetic
;
using
Strategy
=
Condition
<>::
Strateg
y
;
using
Policy
=
Condition
<>::
Polic
y
;
// 避免重复销毁
if
(
!
_data
->
isValid
())
return
;
...
...
@@ -330,7 +330,7 @@ void ThreadPool::destroy(DataType&& _data)
_data
->
setValid
(
false
);
// 通知守护线程退出
_data
->
_condition
.
notify_all
(
Strateg
y
::
RELAXED
);
_data
->
_condition
.
notify_all
(
Polic
y
::
RELAXED
);
// 分离守护线程
//_data->_thread.detach();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录