2015-06-17 168 views
0

我有一个代码,我测试了多少时间将执行10个线程。C++线程的执行时间和执行线程在另一个线程

#include <iostream> 
#include <thread> 
#include <chrono> 
#include <time.h> 
using namespace std; 

void pause_thread(int n){ 
    this_thread::sleep_for(chrono::seconds(n)); 
    cout << "pause of " << n << " seconds ended\n"; 
} 

int main(){ 
    clock_t EndTime = clock(); 
    thread threads[10]; 

    cout << "Spawning 10 threads...\n"; 
    for (int i = 0; i<10; ++i) 
     threads[i] = thread(pause_thread, i + 1); 

    cout << "Done spawning threads. Now waiting for them to join:\n"; 
    for (int i = 0; i<10; ++i) 
     threads[i].join(); 

    cout << "All threads joined!\n"; 
    cout << "==================================================\n"; 
    cout << "Time of executing threads: " << (double)(clock() - EndTime)/CLOCKS_PER_SEC << endl; 

    system("pause"); 
    return 0; 
} 

输出是这样的:

Spawning 10 threads... 
Done spawning threads. Now waiting for them to join: 
pause of 1 seconds ended 
pause of 2 seconds ended 
pause of 3 seconds ended 
pause of 4 seconds ended 
pause of 5 seconds ended 
pause of 6 seconds ended 
pause of 7 seconds ended 
pause of 8 seconds ended 
pause of 9 seconds ended 
pause of 10 seconds ended 
All threads joined! 
================================================== 
Time of executing threads: 10.041 

首先的问题是:为什么该程序的执行需要10041秒如果每个线程之间的暂停是1秒?该程序发生了什么,执行额外的0.041s? 第二个问题是:这是正确的方式来执行线程在另一个线程?

threads[i] = thread(...); 

这是否意味着线程在线程中?

如果不是,怎么办(在另一个线程中执行线程)?

+1

关于你的第一个问题,暂停时间并不能保证是你设置的时间(在本例中为1秒)。该线程将阻止*至少* 1秒,也许更多一点。有关更多详细信息,请参阅http://en.cppreference.com/w/cpp/thread/sleep_for。 –

回答

0

布兰登哈斯顿的评论很好地回答了第一个问题。

对第二个问题的回答不适用于评论。

threads[i] = thread(...); 

意味着一个std ::线程已被创建,其代表的std ::线程对象已被分配给的std ::线程阵列中的狭槽。这提出了一个问题,稍后当我有一个编译器可以使用时,我将不得不考虑这个问题:刚刚被覆盖的线程发生了什么?

无论如何,这个新线程不在另一个线程内。线程没有任何所有权相互的概念。进程拥有线程,但线程不拥有线程。一个线程可以启动另一个线程。例如,

void pause_thread(int n){ 
    this_thread::sleep_for(chrono::seconds(n)); 
    cout << "pause of " << n << " seconds ended\n"; 
    if (! cows_are_home) 
    { 
     thread newthread(pause_thread, 1); 
     newthread.detach(); 
    } 
} 

每一个新的线程将等待大约1秒钟,然后创建一个线程,将等待一秒钟,然后再创建线程,这将继续下去,直到母牛回家。

+0

非常好的解释。谢谢。 – Almir