#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <errno.h> pthread_mutex_t lock; void fun1(void){ int i = 0; while(i<100){ printf("A ");i++; } } void fun2(void){ int i = 0; while(i<100){ printf("B ");i++; } } int main(){ pthread_create(&tida, NULL, (void*)fun1, NULL); pthread_create(&tidb, NULL, (void*)fun2, NULL); pthread_join(tida, NULL); pthread_join(tidb, NULL); return 0; }
这个代码,创建了两个线程,分别输出100个A和100个B,但是输出结果很奇怪。
都是BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA。
也就是说先完成了B线程,再完成A线程。
说好的线程抢占CPU呢?
想了很久都没发现答案。。
最后发现是,输出100个A需要的时间太短了。A线程抢到了CPU。在一个时间片里面输出100次A后,时间还足够。所以造成了这个假象。
然后我把循环扩大到100000次,让整个循环不能在一个时间片里面完成,就可以出现交替了。
另一个方法是,用usleep函数,让单次运行得就一点。
不过这还是看个人的电脑
我同学在mac pro上是ABABABA这样输出的。
但我的ubuntu虚拟机确实AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB。
所以以后大家注意这一点。就算用了互斥量或者信号量,都得sleep
很奇怪的问题