Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
6647ba62
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6647ba62
编写于
8月 23, 2016
作者:
P
Pavel Kartavyy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ConcurrentBoundedQueue: move if nothrow assign possible. copy otherwise
上级
457109ac
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
31 addition
and
8 deletion
+31
-8
dbms/include/DB/Common/ConcurrentBoundedQueue.h
dbms/include/DB/Common/ConcurrentBoundedQueue.h
+31
-8
未找到文件。
dbms/include/DB/Common/ConcurrentBoundedQueue.h
浏览文件 @
6647ba62
...
...
@@ -8,6 +8,35 @@
#include <DB/Core/Types.h>
namespace
detail
{
template
<
class
T
,
bool
is_nothrow_move_assignable
=
std
::
is_nothrow_move_assignable
<
T
>
::
value
>
struct
MoveOrCopyIfThrow
;
template
<
class
T
>
struct
MoveOrCopyIfThrow
<
T
,
true
>
{
void
operator
()(
T
&&
src
,
T
&
dst
)
const
{
dst
=
std
::
forward
<
T
>
(
src
);
}
};
template
<
class
T
>
struct
MoveOrCopyIfThrow
<
T
,
false
>
{
void
operator
()(
T
&&
src
,
T
&
dst
)
const
{
dst
=
src
;
}
};
template
<
class
T
>
void
moveOrCopyIfThrow
(
T
&&
src
,
T
&
dst
)
{
MoveOrCopyIfThrow
<
T
>
()(
std
::
forward
<
T
>
(
src
),
dst
);
}
};
/** Очень простая thread-safe очередь ограниченной длины.
* Если пытаться вынуть элемент из пустой очереди, то поток блокируется, пока очередь не станет непустой.
...
...
@@ -53,10 +82,7 @@ public:
fill_count
.
wait
();
{
Poco
::
ScopedLock
<
Poco
::
FastMutex
>
lock
(
mutex
);
if
(
std
::
is_nothrow_move_assignable
<
T
>::
value
)
x
=
std
::
move
(
queue
.
front
());
else
x
=
queue
.
front
();
detail
::
moveOrCopyIfThrow
(
std
::
move
(
queue
.
front
()),
x
);
queue
.
pop
();
}
empty_count
.
set
();
...
...
@@ -97,10 +123,7 @@ public:
{
{
Poco
::
ScopedLock
<
Poco
::
FastMutex
>
lock
(
mutex
);
if
(
std
::
is_nothrow_move_assignable
<
T
>::
value
)
x
=
std
::
move
(
queue
.
front
());
else
x
=
queue
.
front
();
detail
::
moveOrCopyIfThrow
(
std
::
move
(
queue
.
front
()),
x
);
queue
.
pop
();
}
empty_count
.
set
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录