2 firetxt firetxt 于 2016.03.09 01:35 提问

函数调用先后顺序的问题

#include

#include

#include

#define THREAD_NUMBER 3//线程个数

#define REPEAT_NUMBER 5

#define DELAY_TIME_LEVELS 10.0

void *thrd_func(void *arg)//线程函数

{

int thrd_num = (int)arg ;

int delay_time = 0 ;

int count = 0 ;

printf("thread %d is starting\n", thrd_num) ;

for (count = 0; count < REPEAT_NUMBER; count++)//每个线程完成五次任务

{

delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;//产生随机时间

sleep(delay_time) ;

printf("\tThread %d:job %d delay = %d\n",

thrd_num, count, delay_time) ;

}

printf("thread %d finished\n", thrd_num) ;

pthread_exit(NULL) ;

}

int main()

{

pthread_t thread[THREAD_NUMBER] ;

int no = 0, res ;

void *thrd_ret ;

srand(time(NULL)) ;//产生随机种子

for(no = 0; no < THREAD_NUMBER; no++)

{

res = pthread_create(&thread[no], NULL, thrd_func, (void *)no) ;//创建线程

if (res != 0)

{

printf("create thread %d failed\n", no) ;

exit(res) ;

}

}

printf("create threads success\n waiting for threads to finish...\n") ;

for (no = 0; no < THREAD_NUMBER; no++)

{

res = pthread_join(thread[no], &thrd_ret) ;//等待线程结束

if (!res)

{

printf("thread %d joined\n", no) ;

}

else

{

printf("thread %d joined failed", no) ;

}

}

exit(0) ;

}

为什么首先输出的是这段create threads success waiting for threads to finish...,不是应该先调用了线程函数么,为什么首先输出的不是thread %d is starting,本人小白,求大侠指点,感谢?

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.09 08:56

调用线程函数不等于先执行它,线程调用是异步的,执行顺序是随机的。

xdshengk
xdshengk   2016.03.09 09:43

线程和主进程 是时间片占用CPU的, 也就是说这两个线程之间不是同步的,不分先后顺序执行

WinsenJiansbomber
WinsenJiansbomber   2016.03.09 12:58

多线程序就没有顺序的概念了,除非加代码让它们有序运行,这就又回到单线程了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
python中函数调用的顺序
    单独的函数调用都是从上到下,从左到右,一般是先写函数,然后在下面按照顺序来调用(或者下面的调用上面的)。但是在class中函数的调用可以不按照顺序调用函数(这个仅仅在class中)。        class f 后面可以不加(),一般没有继承都跟 基类 object, 这样是可以的  如果 没有class 这样就会报错。...
C++ 函数调用的匹配顺序
(1)寻找一个参数完全匹配的函数,如果找到了就调用它。 (2)在1失败后,寻找一个函数模板,使其实例化,产生一个匹配的函数模板,          若找到了,就调用它。 (3)在1、2均失败后,再试一试低一级的对函数的重载方法,例如通过类型转换          可产生参数匹配等,若找到了,就调用它。 (4)若以上均失败,则就是一个错误的调用。 #include using names
函数调用顺序的问题
看到一个题目:子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是? 写了代码来测试一下顺序。 public class SuperClass { static{ System.out.println("父类静态函数"); } public Super
C++虚继承(九) --- 构造函数调用顺序的实用之处
虚拟继承是C++语言中一个非常重要但是又比较生僻的存在,它的定义非常简单,但是对于理解C++的继承机制却是非常有用的。笔者最近学习过程中发现对C++的虚拟继承不是很明朗,故在这里对虚继承做个小结。 首先说下遇到的问题吧。代码如下(代码来自于何海涛《程序员面试精选100题第32题)。意图是要设计一个不能被继承的类,类似java中的final。但是又可以生成栈对象,可以像一般的C++类一样使用。
Linux环境下注册函数的调用顺序
为了验证atexit()函数在Linux环境下的调用顺序,我们先来写四个fun函数,这样而且每个函数里边加一句话,这样我们就能更加清晰的在屏幕上看到 各个函数的调用顺序了。下边我们直接看代码。 这个是运行结果: 过程分析: atexit函数先注册四个fun函数然后等待3秒,再打印hello main (如果main函数中不加\n 则main函数要输出的内容会先放到标准输出的缓冲区中,当ma
部分告别Qt调试,另类使用显示Qt程序中函数加载顺序的方式
Qt调试的另类做法,可以快速通过控制台知道程序执行的函数名称和函数执行顺序
js中函数的定义有无顺序的区别
根据网上看的文章,小结如下: JavaScript代码是从上到下顺序执行的。 JavaScript解释引擎在执行任何函数调用之前,首先会在全局作用域中注册以定义式创建的函数,然后再依次执行函数调用。由于注册函数时,后定义的函数重写了先定义的函数,因此无论调用语句位于何处,执行的都是后定义的函数。相反,对于声明式创建的函数,JavaScript解释引擎会像对待任何声明的变量一样,等到
JavaScript代码执行的先后顺序问题
一、js---&amp;gt;单线程严格意义上来说,javascript没有多线程的概念,所有的程序都是单线程依次执行的。1、什么是单线程?  通俗点说,就是代码在执行过程中,另一段代码想要执行就必须等当前代码执行完成后才可以进行。我们拿一段代码来解释一下吧for(var i=1;i&amp;lt;=3;i++){ setTimeout(function(){ console.log(i); //...
销售管理.c
guide函数调用有问题
C语言函数调用问题汇总
1. 形参问题 形参——形式化的参数,这种解释很抽象。 在任何编程语言中,任何变量都是某个特定的存储空间的一段而已,这一段具体有多大,由变量的类型决定,如 int 型,则为4 Byte。 在进行函数/方法的调用时,函数的实参是存在于存储空间某个具体位置的一段指定空间的,而任何函数或方法都会被程序控制器开辟一个栈空间(stack),这个空间也是一段存储位置,有时候为了效率起见,它存在于