是否在线程之间共享pthread函数中声明的变量?

时间:2017-12-07 06:47:47

标签: c multithreading pthreads

我是C和pthreads的新手。这是一个例子(可能不会像我现在写的那样编译),但它显示了我想知道的内容:

int i = 50;

void* myFunc (void* whatever) {
    int myLoop = 0;
    for (;;) 
    {
        for (myLoop = 0; myLoop < i; myLoop++)
            do work blah;
    }
    pthread_exit(NULL);
}

int main (void) {
    pthread_t threadNo1, threadNo2, threadNo3;

    pthread_create(&threadNo1, NULL, myFunc, NULL);
    pthread_create(&threadNo2, NULL, myFunc, NULL);
    pthread_create(&threadNo3, NULL, myFunc, NULL);

    pthread_join(threadNo1, NULL);
    pthread_join(threadNo2, NULL);
    pthread_join(threadNo3, NULL);

    pthread_exit(NULL);
}

3个线程之间是否共享int myLoop

myFunc中的循环是否在所有3个线程上都正常运行(如正确迭代到50,这是int i的值),或者由于{{myLoop++,它们的值是否持续超过其值1}?这是因为变量int myLoop在所有不同的线程中共享其内存值吗?

我希望myFunc在给予不同核心的不同线程上运行,而不会在循环时相互混乱,这意味着循环在所有线程上完美迭代,并且它们彼此无知。或者这实际上不是问题,而且确实是这样做的?

1 个答案:

答案 0 :(得分:2)

  

3个线程之间是否共享了my myLoop?

线程与它无关。关于单个线程,可以询问同样的问题。考虑:

int myFunc(int *j)
{
    int q;
    // lots of code here
    myFunc (&q);
}

考虑调用myFunc然后调用myFunc的单个线程。 myFunc共享q的两个实例是不是?答案是 - 两者都是。每次调用都有自己的q。但是如果第二次调用*j = 2;,它将改变第一次调用q的值。

所以每个人都有自己的,但如果他们愿意,他们可以共享它们,因为它们具有相同的进程内存视图。

与线程相同。