线程执行小例子

虽然成功地创建新的线程,但是需要知道这两个线程是否的确同时都在执行,可以通过一个小例子,这里就不考虑性能运行效率了

这里的想法就是设置一个全局变量,让它在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的值来通知另一个线程运行打印,来来往往,交替执行

发表评论