3

我正在尝试比较 Linux 上 boost::atomic 和 pthread 互斥锁的性能:

 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ;
 int g = 0 ;

 void f()
 {

    pthread_mutex_lock(&mutex);
    ++g;
    pthread_mutex_unlock(&mutex);
    return ;
 }
 const int threadnum = 100;
 int main()  
 {
    boost::threadpool::fifo_pool tp(threadnum);
    for (int j = 0 ; j < 100 ; ++j)
    {
            for (int i = 0 ; i < threadnum ; ++i)
                    tp.schedule(boost::bind(f));
            tp.wait();
    }
    std::cout << g << std::endl ;
    return 0 ; 
 }

是时候了:

 real    0m0.308s
 user    0m0.176s
 sys     0m0.324s

我也试过 boost::atomic:

 boost::atomic<int> g(0) ;

 void f()
 {

      ++g;
    return ;
  }
  const int threadnum = 100;
  int main()
  {
    boost::threadpool::fifo_pool tp(threadnum);
    for (int j = 0 ; j < 100 ; ++j)
    {
            for (int i = 0 ; i < threadnum ; ++i)
                    tp.schedule(boost::bind(f));
            tp.wait() ;
    }
    std::cout << g << std::endl ;
    return 0 ;
   }

是时候了:

 real    0m0.344s
 user    0m0.250s
 sys     0m0.344s

我多次运行它们,但时间结果相似。

atomic 真的可以帮助避免由 mutex/semaphore 引起的系统调用开销吗?

任何帮助将不胜感激。

谢谢

更新:将循环数增加到 1000000

    for (int i = 0 ; i < 1000000 ; ++i)
    {
            pthread_mutex_lock(&mutex);
            ++g;
            pthread_mutex_unlock(&mutex);
    }

类似于 boost::atomic 。

通过“time ./app”测试时间

使用提升:原子:

real    0m13.577s
user    1m47.606s
sys     0m0.041s

使用 pthread 互斥锁:

real    0m17.478s
user    0m8.623s
sys     2m10.632s

似乎 boost:atomic 更快,因为 pthread 使用更多时间进行系统调用。

为什么 user time + sys 大于 real time ?

欢迎任何意见!

4

1 回答 1

5

我猜你没有正确测量原子与互斥锁所花费的时间。相反,您正在测量 boost 线程池管理所产生的开销:设置新任务 f() 比执行任务本身需要更多时间。

我建议你在 f() 中添加另一个循环来获得类似的东西(对原子版本做同样的事情)

 void f()
 {
    for(int i = 0  ; i < 10000 ; i++) {
      pthread_mutex_lock(&mutex);
      ++g;
      pthread_mutex_unlock(&mutex);
    }
    return ;
 }

如果有变化,请发布分数,我很想看看有什么不同!

于 2012-06-10T15:27:15.467 回答