请教关于线程并行运行的问题

#include <iostream.h>
#include <pthread.h>

void* fun(void* arg)
{
    for(int i=1; i<=1000; i++)
        cout<<"fun thread"<<endl;

    return NULL;
}

int main()
{
    pthread_t t1;
    pthread_create(&t1,NULL,fun,NULL);

    for(int i=1; i<=1000; i++)
        cout<<"main thread"<<endl;

    pthread_join(t1,NULL);

    return 0;
}

我以为是两线程并行运行,即打几行 fun thread 再打几行 main thread 如此交替下去,直到2000行打完.
可实际运行的情况是先把 fun thread 1000行打完,再打1000行 main thread 。这不和函数调用一样吗!
哪位高人能解释一下吗?如何实现第一种情况呢?
非常感激!!!

每个线程运行都有一个时间片。如果你打印1000行所需要的时间小于4MS,当然一次就打完了。线程并没有切换。
你可以改一下你的程序。循环一定次数再打印一次试试。应该可以看到你想要的结果。

把循环数改大了也是这样,改成一个很大的数字,会等很长时间把 “fun thread” 打完再打 “main thread” ,我想时间片没有这么长吧.
可我发现再建一个线程打印,三个线程就能并行运行了
难道线程数一定要>2 ???

不知道是否和你的线程的调度算法有关。

建议如帮助文档的例子一样加上初始化参数看看。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void*  function( void*  arg )
{
   printf( "This is thread %d\n", pthread_self() );
   return( 0 );
}

int main( void )
{
   pthread_attr_t attr;

   pthread_attr_init( &attr );
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED );
   pthread_create( NULL, &attr, &function, NULL );

   /* Allow threads to run for 60 seconds. */
   sleep( 60 );
   return EXIT_SUCCESS;
}

帮助文档的例子试过了,也是这种情况
也修改过线程的属性,不管怎样试都是两线程不能并行运行
只要线程数>2就能并行运行
很奇怪啊,不过只要能并行运行就行,即使线程数>2
我还曾经以为要自已控制线程的调度

很奇怪吧。:slight_smile:

用cout(或者printf)来做线程测试从来就不是一个好主意。你要认识到在QNX上,一个printf()实际上是发一条消息到另一个进程(你的程序发一个消息到console驱动)来完成的。而且显示一行字还涉及到流处理,以及文件流加锁,情况可能比你想像的要复杂得多。

具体到你的程序,在两个线程的时候好象不能交错显示,只是因为标准输出的文件流在输出时加了锁,使线程切换窗口变得很小了。多加一个线程,或是将你的程序在SMP机器上运行,增加了线程切换成功的概率,所以你能看到正确的结果。

下面的代码,同你的代码相像,但可以更容易看到结果。


#include <iostream.h> 
#include <pthread.h> 

void* fun(void* arg) 
{ 
    for(int i=1; i<=1000; i++) {
       for(int j=1; j<1000000;j++);
       cout<<"fun thread"<<endl; 
    }

    return NULL; 
} 

int main() 
{ 
    pthread_t t1; 
    pthread_create(&t1,NULL,fun,NULL); 

    for(int i=1; i<=1000; i++) {
       for(int j=1; j<1000000;j++);
       cout<<"main thread"<<endl; 
    }
    pthread_join(t1,NULL); 

    return 0; 
}

非常感谢XTANG精采专业的回答!