4
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

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

谢谢

更新:

-我在 Ubuntu Linux 下使用 Eclipse CDT

-我对 Pthread 进行了同样的尝试,得到了相同的结果

4

2 回答 2

3

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

于 2012-06-20T03:36:19.223 回答
1

首先, withi=0 2.0/i被零除(对不起,正如 Igor 在评论中正确指出的那样,它对浮点运算有效,并且在这种情况下,它会导致 + 无穷大。

其次,即使你修复了这个问题,你的testlock函数也可能会被优化为空,因为结果永远不会被使用。

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

于 2012-06-19T09:39:13.780 回答