这是我的代码:
static long x = 0;
void * thread_func(void *arg){
while(1){
printf("Thread 2 says %ld\n",++x);
sleep(1);
}
}
int main(){
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
while(x < 10) {
printf("Thread 1 says %ld\n",++x);
sleep(2);
}
return 0;
}
现在书的内容是:
OUTPUT
Thread 1 says 1
Thread 2 says 2
Thread 2 says 3
Thread 1 says 4
Thread 2 says 5
Thread 2 says 6
Thread 1 says 7
Thread 2 says 8
Thread 2 says 9
Thread 1 says 10
Thread 2 says 11
Thread 2 says 12
现在第一个不应该是线程2说1,因为pthread_create()
在main中的while循环之前。
睡觉怎么在这里工作?
就像一个线程正在睡觉的那样,以及当执行线程休眠时执行什么进程。?
即睡眠(1)和睡眠(2)1和2表示什么?
答案 0 :(得分:3)
我不确定你正在阅读哪本书,但你应该立即停止阅读。首先,在main
中输入循环之前,您无法保证线程将启动并运行。它可以在之前或之后开始。其次,从两个不同的线程访问变量x
时没有访问同步,因此无法保证它将具有什么值。调用printf
在stdout
对象上进行同步,并且调用sleep
将线程交换掉,并且需要花费大量时间再次安排它。这个例子没用,对输出的假设是错误的。
现在,有些答案..
现在不应该是第一个应该是线程2说1,因为 pthread_create()在main中的while循环之前。
不一定。启动另一个线程需要很多CPU周期。因此,在其他线程启动之前,您很可能会在while
中输入main
循环。但是,不一定。
此外,睡眠是如何工作的?
它告诉内核在给定的秒数内不执行调用线程。由于与调度相关的开销,实际休眠时间可能会稍长。其他线程不受此影响(嗯,它们是,但不是直接,即其他线程可能有更多的CPU时间等。)
执行线程休眠时执行什么进程?
进程从不执行任何操作。内核的计划执行进程(和线程)。默认情况下,进程由一个主线程组成,内核执行它。当您创建更多线程时,调度程序会在进程内执行更多线程等。当一个或多个线程处于休眠状态时,调度程序会执行那些未休眠的线程。将线程视为共享相同地址空间的进程 - 就是它们的本质。
答案 1 :(得分:0)
该程序存在一个巨大的缺陷,没有多线程程序可以承受。我实际上允许全局变量“x”由2个线程操纵,它们之间没有任何同步。这肯定会导致变量中包含的数据变得不一致。将产生不可预测的输出。你需要用一个很好的例子来推荐一本更好的书。基本上这个想法是在访问变量'x'时使用锁。
正如上面的其他人指出的那样,sleep将阻止内核执行所需的秒数。我觉得它在这里被用作同步手段。但是睡眠永远不是一个好选择,因为它不能保证变量'x'上的操作不会变得不一致。不要依赖睡觉。使用锁。一个开始线程编程的好地方是
http://cs.tju.edu.cn/orgs/hpclab/course/undergraduate/Ref/POSIXMultithreadProgrammingPrimer.pdf
它的pthread引物。