计算创建 n 个线程所花费的时间

calculating time taken to create n threads

本文关键字:时间 线程 创建 计算      更新时间:2023-10-16

我正在尝试创建 1000 个线程,以便我知道创建它们需要多少时间。我使用线程。但是我得到细分错误:11。谷歌搜索它告诉我,这可能是使用太多内存的情况,但我怀疑这是可能的原因。

关于可能是什么原因的任何指示?

法典:

int main(int argc , char *argv[])
{
   int *i;          // Matti's answer below:  ... = (int*)malloc(sizeof(int));
   *i = 0;
   while( *i < 100)
   {
     pthread_t thread_id;
     puts("Connection accepted");
     if( pthread_create( &thread_id , NULL , connection_handler ,  (void*) &i) < 0)
     {
        error("could not create thread");
        return 1;
     }
     //pthread_detach(thread_id);
     *i = *i + 1;
   }
    return 0;
}
void *connection_handler(void *i)
{
  sleep(1);
  return 0;
}

您的问题是您正在取消引用从未初始化的指针:

int *i;
*i = 0;

只是int i;有什么问题?

谷歌搜索它告诉我,这可能是使用太多内存的情况

在 Ubuntu 15.10 和 g++ v5.2.1 上,

 default stack size per thread is 8M bytes

因此,1000 * 8M可能与8G字节一样多。

我的旧戴尔总共只有4G字节的dram。 我认为这可能意味着超过 1/2 的线程堆栈将滚入/滚出交换分区。

不确定您是否想花任何时间衡量或担心它。


顺便说一下,线程上下文切换非常慢,比函数/方法调用慢大约 3 个数量级......明智地使用它们。

在我的旧戴尔 - 使用 c++_11 线程和 std::mutex:

     50 nano seconds per std::mutex lock and std::mutex::unlock
~12,000 nano seconds per context switch enforced by std::mutex

我在上面的代码片段中没有看到的是::p thread_exit()。 您可以采取合理的创建和退出措施...也许您还打算在内存不足之前退出每个线程?


更新 - 使用 POSIX 获取线程堆栈大小

void stackShow() // posix thread stack size
{
   pthread_attr_t tattr;  
   int stat = pthread_attr_init (&tattr); 
   assert(0 == stat);
   size_t size; 
   stat = pthread_attr_getstacksize(&tattr, &size); 
   assert(0 == stat);
   std::cout << "  ----------------------------------------------------n"
             << "  getstacksize: (" << stat << ")   size is " << size 
             << "nn";
   stat = pthread_attr_destroy(&tattr);
   assert(0 == stat);
}