z****e 发帖数: 2024 | 1 我怎么觉得很多情况多线程都比单线程慢呢?
我是能不加互斥锁就不加,
而且也没有busy waiting。
看见两个cpu100%工作,结果,还是比一个cpu100%要慢,或者想当。
这种为什么? |
p***o 发帖数: 1252 | 2 many reasons, just post your code
【在 z****e 的大作中提到】 : 我怎么觉得很多情况多线程都比单线程慢呢? : 我是能不加互斥锁就不加, : 而且也没有busy waiting。 : 看见两个cpu100%工作,结果,还是比一个cpu100%要慢,或者想当。 : 这种为什么?
|
z****e 发帖数: 2024 | 3 我用了个Zthread库,不是很主流的。
#include
#include
#include
#include
#include
#include "zthread/Condition.h"
#include "zthread/Mutex.h"
#include "zthread/Guard.h"
#include "zthread/ThreadedExecutor.h"
using namespace ZThread;
using namespace std;
const int M=1E8;
class oprand{
public:
oprand():c(lock),n1(0),n2(0),flag1(0),flag2(0){}
void cal1(){
for(n1=1 ;n1<1E8;n1=n1+n1%3)
flag1=1;
c.signal();
}
void cal2(){
for(
【在 p***o 的大作中提到】 : many reasons, just post your code
|
a****l 发帖数: 8211 | 4 just a wild guess: compiler optimization.
【在 z****e 的大作中提到】 : 我用了个Zthread库,不是很主流的。 : #include : #include : #include : #include : #include : #include "zthread/Condition.h" : #include "zthread/Mutex.h" : #include "zthread/Guard.h" : #include "zthread/ThreadedExecutor.h"
|
p***o 发帖数: 1252 | 5 1 cal1 里少了个分号。
2 开了优化再说。100M个循环要不了1s。
3 你就同步了一次,多线程不应该慢。
【在 z****e 的大作中提到】 : 我用了个Zthread库,不是很主流的。 : #include : #include : #include : #include : #include : #include "zthread/Condition.h" : #include "zthread/Mutex.h" : #include "zthread/Guard.h" : #include "zthread/ThreadedExecutor.h"
|
z****e 发帖数: 2024 | 6 分别用-O0,-O1,-O2,-O3,都没有太大效果。
最多有个10%的变化。还是单线程那个快不少。
另外,那个分号加上去了,不影响结果。
-O3下的结果:
3.22 seconds,双线程
2.41 seconds,单线程。
我是明明看见双线程时候,两个cpu100%,然后一个还维持在100%,另一个掉下来。对,我就同步了一次,在双线程的时候。
【在 p***o 的大作中提到】 : 1 cal1 里少了个分号。 : 2 开了优化再说。100M个循环要不了1s。 : 3 你就同步了一次,多线程不应该慢。
|
z****e 发帖数: 2024 | 7 那个run就是线程启动的函数。
thread 对象,必须要一个heap上面的指针,
就是这句话。
exe.execute(new events(p, &oprand::cal2) );
我也不知道,这个stack上边的exe,怎么操作heap上的指针的。
因为多数情况,当main()退出的时候,其他线程还没完事。
我就奇怪,这个stack上的exe thread对象,main结束的时候,不是已经玩完了么?怎
么还能顺利的销毁它持有的heap指针呢? |
p***o 发帖数: 1252 | 8 你把cal0里的signal去掉,然后把cal0后面的see也去掉,看看啥结果。
对,我就同步了一次,在双线程的时候。
【在 z****e 的大作中提到】 : 分别用-O0,-O1,-O2,-O3,都没有太大效果。 : 最多有个10%的变化。还是单线程那个快不少。 : 另外,那个分号加上去了,不影响结果。 : -O3下的结果: : 3.22 seconds,双线程 : 2.41 seconds,单线程。 : 我是明明看见双线程时候,两个cpu100%,然后一个还维持在100%,另一个掉下来。对,我就同步了一次,在双线程的时候。
|
z****e 发帖数: 2024 | 9 那个see()不好去掉,因为要知道线程什么时候结束
see()里边有个wait在等信号,去掉see(),main()直接就结束了。
【在 p***o 的大作中提到】 : 你把cal0里的signal去掉,然后把cal0后面的see也去掉,看看啥结果。 : : 对,我就同步了一次,在双线程的时候。
|
z****e 发帖数: 2024 | 10 刚才编译有个typo,后来发现了,-O3是总体快了很多。但是仍然是单线程快
output |
|
|
p***o 发帖数: 1252 | 11 你不是有个f么,单线程用这个好了。
【在 z****e 的大作中提到】 : 那个see()不好去掉,因为要知道线程什么时候结束 : see()里边有个wait在等信号,去掉see(),main()直接就结束了。
|
p***o 发帖数: 1252 | 12 那个execute函数会创建一个线程吗?如果是,你得把这个时间刨掉。
一般来说要避免频繁创建/销毁线程。通常都搞个thread pool,然后
把要执行的函数传过去。
【在 z****e 的大作中提到】 : 我用了个Zthread库,不是很主流的。 : #include : #include : #include : #include : #include : #include "zthread/Condition.h" : #include "zthread/Mutex.h" : #include "zthread/Guard.h" : #include "zthread/ThreadedExecutor.h"
|
z****e 发帖数: 2024 | 13 我就是单线程用的那个f。
觉得多线程这玩意还真难搞得很精通。
【在 p***o 的大作中提到】 : 你不是有个f么,单线程用这个好了。
|
g****y 发帖数: 436 | 14 heihei, in my test:
gcc: -O1
total loops:2000000000
Time for threaded call:00:00:02
Time for non-threaded call:00:00:03
codes:
#include "threading.h"
#include "timer.h"
#include
#include
#include
int M;
void* cal1(void* vp) {
int flag1 = 0;
for (int n = 0; n < M; n++) {
flag1 = 1;
}
}
void* cal2(void* vp) {
int flag2 = 0;
for (int n = 0; n < M; n++) {
flag2 = 1;
}
}
void* cal0(void* vp) {
int flag2 = 0;
for (int n = 0; n < M; n++) {
fla
【在 z****e 的大作中提到】 : 我用了个Zthread库,不是很主流的。 : #include : #include : #include : #include : #include : #include "zthread/Condition.h" : #include "zthread/Mutex.h" : #include "zthread/Guard.h" : #include "zthread/ThreadedExecutor.h"
|
z****e 发帖数: 2024 | |