虽然成功地创建新的线程,但是需要知道这两个线程是否的确同时都在执行,可以通过一个小例子,这里就不考虑性能运行效率了
这里的想法就是设置一个全局变量,让它在0和1之间跳动,主线程在这个flag为0的时候,就打印0,并将flag赋值为1,而在这个过程当中,子线程沉睡1秒,;同样的接下来子线程在这个flag为1的时候,打印1,并将flag赋值为0,而这个过程中,主线程沉睡1秒,说白了也就是主线程和子线程分别sleep 1秒后打印一个数字,而打印的条件却是依赖于对方1秒前对全局变量的修改,假如这两个线程不是同时都在执行,那么比如主线程修改了全局变量,子线程如果没运行或者延后运行,那么主线程肯定会少打印0的次数,而不会主线程和子线程次数都一样,原因是:
只有他们同时运行,交叉依赖,打印的0和1才是交叉出现,更关键的是次数一致,而且都是while里设定数据的一半,因为另一半sleep去了,没有打印;实际上通过切换flag来叫醒对方线程,相信看了code就了解了
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> int bool_now = 0; void *thread_function(){ int child = 0; while (child++ < 30){ if (bool_now == 1){ printf("1"); bool_now = 0; } else sleep(1); } pthread_exit("I am lihui"); } int main(){ pthread_t a_thread; void *thread_result; if (pthread_create(&a_thread, NULL, thread_function, NULL)){ printf("Create new thread failed!\n"); exit(1); } printf("Waiting for child thread to finish...\n"); int main = 0; while (main++ < 30){ if (bool_now == 0){ printf("0"); bool_now = 1; } else sleep(1); } if (pthread_join(a_thread, &thread_result)){ printf("Thread join failed!\n"); exit(1); } printf("\nThread joined, it returned: %s\n", (char *)thread_result); return 0; }
编译运行下,稍微要多等几秒
lihui@2015 ~ $ ./a.exe Waiting for child thread to finish... 010101010101010101010101010101 Thread joined, it returned: I am lihui
可见0和1交叉出现,通过切换bool_now的值来通知另一个线程运行打印,来来往往,交替执行