w***g 发帖数: 5958 | 1 下面这个程序总结了C++11中最主要的多线程特性。
教程在注释里。国内的人不愿意读英文,我给他们写的。
版上有还没转C++11的也可以看看。
http://www.wdong.org/fun/thread-tutorial.cpp |
p***o 发帖数: 1252 | 2 有书推荐吗?
【在 w***g 的大作中提到】 : 下面这个程序总结了C++11中最主要的多线程特性。 : 教程在注释里。国内的人不愿意读英文,我给他们写的。 : 版上有还没转C++11的也可以看看。 : http://www.wdong.org/fun/thread-tutorial.cpp
|
w***g 发帖数: 5958 | 3 就是为了让他们不需要看书就能上手才写的。
【在 p***o 的大作中提到】 : 有书推荐吗?
|
p***o 发帖数: 1252 | 4 刚注意到你是让国内的人看,挺清楚的。
【在 w***g 的大作中提到】 : 就是为了让他们不需要看书就能上手才写的。
|
d****i 发帖数: 4809 | 5 比起直接用pthread怎么样?
【在 w***g 的大作中提到】 : 下面这个程序总结了C++11中最主要的多线程特性。 : 教程在注释里。国内的人不愿意读英文,我给他们写的。 : 版上有还没转C++11的也可以看看。 : http://www.wdong.org/fun/thread-tutorial.cpp
|
w***g 发帖数: 5958 | 6 写起来更方便,而且portable。在linux上就是用pthread实现的。
比较不爽的是std::thread在高并发上还远远比不上goroutine。
C/C++有很多userland thread库,但是都有两个局限:
1. 大部分都不支持M-to-N的线程调度,没法发挥多核优势。
2. 所有的库在系统调用block时都没法自动切换线程。如果想要不被OS block,所有的
IO都必须通过thread库包装过的API调用。比如read就得用XXX_read。
问题1其实只是人力问题,是可以解决的。问题2彻底无解,
因为那么多第三方软件都已经用系统调用写了,最最最少也得全都重新编译一遍,
而且根本无法保证正确性。
【在 d****i 的大作中提到】 : 比起直接用pthread怎么样?
|
N******K 发帖数: 10202 | 7 我用std::thread写了一个parallel for
不知道和openmp比起来 有什么差异
【在 w***g 的大作中提到】 : 写起来更方便,而且portable。在linux上就是用pthread实现的。 : 比较不爽的是std::thread在高并发上还远远比不上goroutine。 : C/C++有很多userland thread库,但是都有两个局限: : 1. 大部分都不支持M-to-N的线程调度,没法发挥多核优势。 : 2. 所有的库在系统调用block时都没法自动切换线程。如果想要不被OS block,所有的 : IO都必须通过thread库包装过的API调用。比如read就得用XXX_read。 : 问题1其实只是人力问题,是可以解决的。问题2彻底无解, : 因为那么多第三方软件都已经用系统调用写了,最最最少也得全都重新编译一遍, : 而且根本无法保证正确性。
|
w***g 发帖数: 5958 | 8 openmp也是pthread啊,性能应该是一样的。
你能贴下你的parallel for吗?我想学习学习。
【在 N******K 的大作中提到】 : 我用std::thread写了一个parallel for : 不知道和openmp比起来 有什么差异
|
N******K 发帖数: 10202 | 9 等我吃玩午饭 贴到本版 供大家测试
【在 w***g 的大作中提到】 : openmp也是pthread啊,性能应该是一样的。 : 你能贴下你的parallel for吗?我想学习学习。
|
D***n 发帖数: 6804 | 10 回答你程序里的问题:
意味着停止当前thread,这个设计我持保留意见。
http://en.cppreference.com/w/cpp/thread/thread/operator%3D
// std::thread 用 = 进行赋值的时候实现的是move而不是copy
//
// 思考:如果=之前A已经和某线程关联了怎么办?
// 我不也不知道答案: )
// 最好的办法就是保证=以前线程对象是空的,或者干脆
// 不要用=操作,除非..
【在 w***g 的大作中提到】 : openmp也是pthread啊,性能应该是一样的。 : 你能贴下你的parallel for吗?我想学习学习。
|
|
|
D***n 发帖数: 6804 | 11 看了一眼文档,C++这个设计纯粹是一个warpper,真正生产上用我觉得至少要实现。
*)Extended thread attributes/class
*)Thread local storage
*)Thread pool/queue
*)Sync
从这一点来说,我觉得应该用现成的thread库,高层程序应该通过thread-safe的数据
结构和底层交流。 |
b*******s 发帖数: 5216 | 12 赞贡献,回头看看
【在 w***g 的大作中提到】 : 下面这个程序总结了C++11中最主要的多线程特性。 : 教程在注释里。国内的人不愿意读英文,我给他们写的。 : 版上有还没转C++11的也可以看看。 : http://www.wdong.org/fun/thread-tutorial.cpp
|
b*******s 发帖数: 5216 | 13 Boost好像有个伪线程是在阻塞在系统调用时可以切换。
【在 w***g 的大作中提到】 : 写起来更方便,而且portable。在linux上就是用pthread实现的。 : 比较不爽的是std::thread在高并发上还远远比不上goroutine。 : C/C++有很多userland thread库,但是都有两个局限: : 1. 大部分都不支持M-to-N的线程调度,没法发挥多核优势。 : 2. 所有的库在系统调用block时都没法自动切换线程。如果想要不被OS block,所有的 : IO都必须通过thread库包装过的API调用。比如read就得用XXX_read。 : 问题1其实只是人力问题,是可以解决的。问题2彻底无解, : 因为那么多第三方软件都已经用系统调用写了,最最最少也得全都重新编译一遍, : 而且根本无法保证正确性。
|
b*******s 发帖数: 5216 | 14 方便了不是一点点
【在 d****i 的大作中提到】 : 比起直接用pthread怎么样?
|
w***g 发帖数: 5958 | 15 thread local storage编译器有支持。thread attribute的话在linux上需要用pthread
,可以弄但是很恶心。thread pool连boost都没个像样的实现。结论是C++标准库还远
远没到可以做稍微复杂点的系统的要求。
不过标准库引入thread毕竟是一个进步。不少程序可以不依赖外部库了。
【在 D***n 的大作中提到】 : 看了一眼文档,C++这个设计纯粹是一个warpper,真正生产上用我觉得至少要实现。 : *)Extended thread attributes/class : *)Thread local storage : *)Thread pool/queue : *)Sync : 从这一点来说,我觉得应该用现成的thread库,高层程序应该通过thread-safe的数据 : 结构和底层交流。
|
d*******r 发帖数: 3299 | 16 收藏了大牛的 blog
作为一个ML外行,就是想要找这样的总结:
http://www.wdong.org/wordpress/blog/2014/05/07/%E6%9C%BA%E5%99%
【在 w***g 的大作中提到】 : 下面这个程序总结了C++11中最主要的多线程特性。 : 教程在注释里。国内的人不愿意读英文,我给他们写的。 : 版上有还没转C++11的也可以看看。 : http://www.wdong.org/fun/thread-tutorial.cpp
|
D***n 发帖数: 6804 | 17 我自己的经验,通常不会直接用std::thread,而是用一个类把它给包起来,这个类里
面实现额外的各种thread属性,比如local storage,attribute之类。
pthread
【在 w***g 的大作中提到】 : thread local storage编译器有支持。thread attribute的话在linux上需要用pthread : ,可以弄但是很恶心。thread pool连boost都没个像样的实现。结论是C++标准库还远 : 远没到可以做稍微复杂点的系统的要求。 : 不过标准库引入thread毕竟是一个进步。不少程序可以不依赖外部库了。
|
w******w 发帖数: 126 | 18 严重同意你这样的设计, 为了以后如果出现更好的thread的库,可以方便的替换。不
会因为绑定在这个标准的 thread后。你的代码release出去后, 只能是望洋兴叹。无
法改动了。
^_^
【在 D***n 的大作中提到】 : 我自己的经验,通常不会直接用std::thread,而是用一个类把它给包起来,这个类里 : 面实现额外的各种thread属性,比如local storage,attribute之类。 : : pthread
|
G***l 发帖数: 355 | 19 Intel TBB怎么样?
【在 w***g 的大作中提到】 : 写起来更方便,而且portable。在linux上就是用pthread实现的。 : 比较不爽的是std::thread在高并发上还远远比不上goroutine。 : C/C++有很多userland thread库,但是都有两个局限: : 1. 大部分都不支持M-to-N的线程调度,没法发挥多核优势。 : 2. 所有的库在系统调用block时都没法自动切换线程。如果想要不被OS block,所有的 : IO都必须通过thread库包装过的API调用。比如read就得用XXX_read。 : 问题1其实只是人力问题,是可以解决的。问题2彻底无解, : 因为那么多第三方软件都已经用系统调用写了,最最最少也得全都重新编译一遍, : 而且根本无法保证正确性。
|
t*******c 发帖数: 288 | 20 大哥,注释里的中文显示是乱码,怎么改过来啊?还是要改什么设置?
多谢了 |
|
|
g*********e 发帖数: 14401 | 21 openmp应该会维护自己的thread pool
【在 w***g 的大作中提到】 : openmp也是pthread啊,性能应该是一样的。 : 你能贴下你的parallel for吗?我想学习学习。
|
b*******s 发帖数: 5216 | 22 visitor pattern ?
【在 w******w 的大作中提到】 : 严重同意你这样的设计, 为了以后如果出现更好的thread的库,可以方便的替换。不 : 会因为绑定在这个标准的 thread后。你的代码release出去后, 只能是望洋兴叹。无 : 法改动了。 : ^_^
|
N******K 发帖数: 10202 | 23 这个应该怎么实现?
【在 g*********e 的大作中提到】 : openmp应该会维护自己的thread pool
|
g*********e 发帖数: 14401 | 24
比如在第一次用到parad flag的时候创造一堆thread。然后用完不关掉
【在 N******K 的大作中提到】 : 这个应该怎么实现?
|
p***o 发帖数: 1252 | 25 你要去看看tbb, parallel for之类的tbb里可以自动做负载均衡。
【在 N******K 的大作中提到】 : 这个应该怎么实现?
|
N******K 发帖数: 10202 | 26 也就省点创造thread的时间 在我的应用里面 这个时间和计算时间比起来 完全忽略
【在 g*********e 的大作中提到】 : : 比如在第一次用到parad flag的时候创造一堆thread。然后用完不关掉
|
w***x 发帖数: 105 | 27 pthread是利器,我觉得已经足够。不理解c++弄这么个很不成熟的thread是想做什么。
比如怎么设置新thread的stack size? |
w***g 发帖数: 5958 | 28 pthread vs std::thread
fd vs std::stream
char * vs std::string
C++库里每一个都是这样。一方面追求平台无关所以很多细节就照顾不到。
另一方面还追求性能,所以又不能做fancy的功能。好在标准库在大部分情况
下够用。不够的时候又很容易用底层的C和OS的库。
我看std::thread还是很好的,可以直接传一个lambda进去,出来的代码
干净多了。
【在 w***x 的大作中提到】 : pthread是利器,我觉得已经足够。不理解c++弄这么个很不成熟的thread是想做什么。 : 比如怎么设置新thread的stack size?
|
s******y 发帖数: 172 | 29 网页没了。有新的地址吗?
【在 w***g 的大作中提到】 : 下面这个程序总结了C++11中最主要的多线程特性。 : 教程在注释里。国内的人不愿意读英文,我给他们写的。 : 版上有还没转C++11的也可以看看。 : http://www.wdong.org/fun/thread-tutorial.cpp
|
o****p 发帖数: 9785 | 30 你可以直接看wdong网站啊,链接变了可是东西还在
【在 s******y 的大作中提到】 : 网页没了。有新的地址吗?
|
|
|
s******y 发帖数: 172 | 31 多谢提醒。找到了。
【在 o****p 的大作中提到】 : 你可以直接看wdong网站啊,链接变了可是东西还在
|
x****u 发帖数: 44466 | 32 C++11/14/17的多线程虽然强了不少但仍然是巨坑,强烈建议不要只看能做什么而是要
仿照某种更高层级语言的pattern做,比如java,js或者C#。
多线程目前看来最优雅我觉得是C#,async/await这种yield给进程内scheduler的写法
很严谨且易读。
【在 s******y 的大作中提到】 : 多谢提醒。找到了。
|