Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的多线程奥秘+;有力地_C++_Multithreading_Boost - Fatal编程技术网

C++ C+中的多线程奥秘+;有力地

C++ C+中的多线程奥秘+;有力地,c++,multithreading,boost,C++,Multithreading,Boost,我在四核PC上运行这段代码(Core2Quad,4核无超线程),所以我预计1-4个线程大约需要相同的时间。相反,似乎只有一个核心被使用。我错过了什么 谢谢 更新: -我正在Ubuntu Linux下使用EclipseCDT -我用Pthread做了同样的尝试,得到了同样的结果。首先,用I=02.0/I除以零(对不起,正如Igor在评论中正确指出的那样,它对浮点运算是有效的,在这种情况下,它会导致+无穷大 Seconly,即使您解决了这个问题,您的testlock函数可能会被优化为零,因为结果永远

我在四核PC上运行这段代码(Core2Quad,4核无超线程),所以我预计1-4个线程大约需要相同的时间。相反,似乎只有一个核心被使用。我错过了什么

谢谢

更新:

-我正在Ubuntu Linux下使用EclipseCDT

-我用Pthread做了同样的尝试,得到了同样的结果。首先,用
I=0
2.0/I
除以零(对不起,正如Igor在评论中正确指出的那样,它对浮点运算是有效的,在这种情况下,它会导致+无穷大

Seconly,即使您解决了这个问题,您的
testlock
函数可能会被优化为零,因为结果永远不会被使用


因此,目前您正在测量创建和连接线程的开销,这就是线性增加的原因。

我的一位同事找到了解决方案:clock()测量CPU周期,因此如果有两个线程在运行,它的运行速度将是预期的两倍。使用gettimeofday计时会得到预期的结果。

I可能是错误的,但构造
threads[j]->join();删除线程[j]
意味着我们必须等到线程运行完毕finished@VitalyDyatlov是的,我立即启动I个线程,然后等待它们全部完成。问题是4个线程应该同时执行,但输出表明不是这样。FWIW,在我的6核Win7上,输出与预期一样:开始测试1个线程:62个2个线程:63个3个线程:62个4 threads:63 5螺纹:62 6螺纹:62 7螺纹:125 8螺纹:125 9螺纹:124 10螺纹:125@ErwinJ问题是
delete
等待线程完成。所以在循环中,您等待每个线程,而不是同时运行它们。检查您的进程关联性:可能它被迫使用一个核心?带bug的玩具代码不是这是一种很好的测量任何东西并期望它具有现实世界适用性的方法。你错了。对于IEEE浮点,有限非零浮点除以0是定义良好的,结果是+无穷大。此外,testlock并没有“优化为零”,至少在MSVC10(任何优化级别)中没有。关于零除的观点很好。不知道为什么这不会导致问题。但是代码没有得到优化:我已经检查过,当我将循环增加到100000000次时,所需的时间是10倍。@Igor R.:谢谢(&upvoted),我不知道。好吧,在这种情况下,msvc编译器真的很蠢……如果启用了优化,gcc肯定不会为此发出任何代码。@Igor:我知道gcc会进行此类优化,我没有尝试就写了我的答案。但现在我只为你编译了它……4.4.6-3(这是我在这里遇到的最老的一个),但旧版本也应该这样做。这也解释了windows的差异,因为windows下的clock()测量墙上的时钟秒数。
static void testlock()
{
    for(int i=0;i<10000000;i++)
    {
        float f=2.0/i;
    }
}

static void TEST()
{
    cout<<"Start testing" <<endl;
    unsigned int startClock;

    for(int i=1;i<=10;i++)
    {
        startClock = clock();
        vector<boost::thread*> threads;
        for(int j=0;j<i;j++)
            threads.push_back(new boost::thread(&testlock));
        for(int j=0;j<i;j++)
        {
            threads[j]->join();
            delete threads[j];
        }
        cout << i << " threads: "<< clock()-startClock << endl;
    }
}
Start testing
1 threads: 180000
2 threads: 350000
3 threads: 540000
4 threads: 730000
5 threads: 900000
6 threads: 1080000
7 threads: 1260000
8 threads: 1510000
9 threads: 1660000
10 threads: 1810000