使用线程增加全局变量

时间:2014-05-15 20:27:43

标签: multithreading

我刚刚编写了以下代码,以更好地了解Threads的工作原理:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

int globalVariable = 1;
void *myfunc (void *myvar);

int main (void) {

    pthread_t thread1;
    int waitms;

    while(globalVariable <= 50){
        printf("Main function: %d \n", globalVariable);

        if (globalVariable==9) {
            pthread_create(&thread1, NULL, myfunc, NULL);
            pthread_join(thread1, NULL);
        }
        usleep(300000);

    globalVariable++;
    }
    return 0;
}

void *myfunc (void *myvar){

    int waitms;

    while(globalVariable<=50) {

        printf("Thread1: %d \n", globalVariable);

        usleep(300000);

        globalVariable++;
    }
    return 0;

}

代码必须打印在main函数中递增的全局变量的值。当此变量的值为9时,main函数调用一个线程,该线程与原始main函数相同,但不调用另一个线程。

在输出中,我得到主函数的前9个打印件,以下所有打印件都来自线程。他们不应该混在一起吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

不,因为你是{1}} thread1,所以主线程阻塞直到thread1死掉。一旦thread1死掉,它就会恢复,但是thread1已经将globalVariable递增到主线程退出第一个while循环的点。

删除joining您会看到混合结果,更好的方法是将连接移到join之外,这样如果主线程退出循环时thread1仍处于活动状态,则等待...到那时候它很可能会死掉,但是你应该确保你的子线程在退出主线程之前完成了。