关于线程问题。急。期中的作业。

海子IT 发布于 2012/03/22 09:49
阅读 392
收藏 0

老师们请教您一些关于线程的程序。

代码:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// repeat the times (*) operation 100,000 times to slow down the
// execution of the instructions
#define RPT 100000
void* print_X() {
int i;
float x;
while (1) {
// consuming some CPU time to slow done the execution
// no logic meaning; can be safely ignored
for(i=0; i<RPT; i++) { x = 3.1415926*3.1415926; }
printf("X");
}
}
void* print_O() {
int i;
float x;
while (1) {
for(i=0; i<RPT; i++) { x = 3.1415926*3.1415926; }
printf("O");
}
}
int main () {
pthread_t tid1, tid2;
pthread_create (&tid1, NULL, &print_X, NULL);
pthread_create (&tid2, NULL, &print_O, NULL);
// Wait till threads complete. Not really related to this
// question in this assignment. Can be ignored.
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf ("\n==========================\n");
}

 

输出:

01: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
02: OOOOOOOOOOOOOO
03: XXXXXXXXXXXXXXXXXXX
04: OOOOOOOOOOOOOOOOOOO
05: XXXXXXXXXXXXXXXXXX
06: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
07: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
08: XXX
09: O
10: X
11: O
12: X
13: O
14: X
15: O
16: XXXXXXXXXXXXXXXXXXXXXXXXX
17: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
18: XXXXXXXXXXXXXXXXXXXXXXX
19: OOOOOOOOOOOOOOOOOOOOOOOO

 

我对这输入很不明白。

1为什么第一行执行60个X输出后停止,转到输出第二行呢?

2为什么第二行输出不是跟第一行的X次数一样

3在输出第一行跟第二行之前的背后有什么活动是我们看不到的

4第8到第15行为什么又只输出这么点

希望忙忙小弟。初学者,请见谅!谢谢!

加载中
0
six
six
多线程同步,mutex, semaphore ...
six
six
看了你下面说的,觉得还是从“hello world”开始吧,先把程序运行起来开始吧
海子IT
可以为我讲详细点么?谢啦
0
晓寒
晓寒

你的程序是自己写的么?程序是正确的,可以正常运行。

回答问题1,2,4:这几个的原因是一样的。你程序里的两个线程都是死循环,执行过程也是一样的。都是for循环延时,然后打印 X 或 O ,两个线程都是独立线程,产生这样输出的原因就是系统的任务调度。而这个你目前可以认为是无法人工干预的。具体的调试和你的cpu个数和操作系统相关。你可以形象的理解为两个人赛跑,只不过它们都要听从一个管理人员的指挥。如果是只有一条跑道(一个CPU)的话,他们只能交替的跑,多于一条跑道的话,就可以同时跑,这是执行过程的举例,而因为两个线程同时输出到一个控制台上,就是你看到的那种情况。你多跑几次看看,结果应该每次都不太一样(如果你机器够快(并且是多个CPU)的话, 可能会是一直X和O交替的情况)。

问题3目前你可以认为是看不到。这操作系统的内部任务调试。

晓寒
晓寒
@海子IT : 客气了,“是因为它们被调用的时间不一样”的准确说法是:“它们执行的时间不一样,根本原因是它们在被调度的时间所剩余的时间片不一样大”(这是比较合理的说法,如果你老师追问到底的话你可以这么说。)
海子IT
@晓寒 : 太感谢啦。。。你是好人。我会我还会厚着脸皮问您问题的
晓寒
晓寒
@海子IT : 是的,是这么理解的。
海子IT
程序不是我写的是我们Lecturer给的。问题也是。我一直找不到头尾。谢谢您啊。 第一行输出跟第二行输出不一样长,是因为它们被调用的时间不一样吗
0
晓寒
晓寒
另外,你用for循环延时不是个好习惯,最好是让线程sleep,这样不占cpu资源。
晓寒
晓寒
@海子IT : 你不可能得到像你们老师那样的结果的,就是你们老师自己也不可能得到那样的结果,上面的结果明显是格式化过的,你们老师把相同的输出弄成一行。所以实际中的输出结果不会是这个样子的。程序的输出结果应该是都不一样。原因参见二楼的回复。
海子IT
@晓寒 : 我已经在linux上运行了这个程序,它就一直在循环。我发现了里面有个while(1)这是死循环的原因。我现在想要怎么样才能得到像我们老师那样的结果。是不是每次的结果都不一样。
six
six
@海子IT : 你是想干嘛?想让程序退出的话改RPT怎么也不会退出。好吧,原来你最最基本的C语言语法都不清楚,还是建议你从能让程序运行开始吧
海子IT
@six : 貌似要把RPT值改了才行。是不
晓寒
晓寒
@海子IT : 那就好好学吧,linux是个很好的东西。学程序是要有自学的习惯的,在哪都一样。
下一页
返回顶部
顶部