【问题标题】:C - pthread function reuse - local variables and race conditionsC - pthread 函数重用 - 局部变量和竞争条件
【发布时间】:2011-07-20 10:40:03
【问题描述】:

如果我定义了一个线程函数,它重用了主线程也使用的另一个函数......是否可能存在竞争条件?同一函数中的局部变量是否跨线程共享?在这种情况下,函数 do_work 用于 thread_one 线程和主线程。两个线程都可以修改函数 do_work 中的局部变量 x 从而产生意外结果吗?

void *thread_one() {
   int x = 0;
   int result;
   while(1) {
       for(x=0; x<10; x++) {
           result = do_work(x);
       }
       printf("THREAD: result: %i\n", result);
   }
}

int do_work(int x) {
    x = x + 5;
    return x;
}

int main(int argc, char**argv) {
    pthread_t the_thread;
    if( (rc1 = pthread_create( &the_thread, NULL, thread_one, NULL)) ) {
        printf("failed to create thread %i\n", rc1);
        exit(1);
    }
    int i = 0;
    int result = 0;
    while(1) {
        for(i=0; i<12; i+=2) {
            result = do_work(i);
        }
        printf("MAIN: result %i\n", result);
    }
    return 0;
}    

【问题讨论】:

    标签: c multithreading pthreads race-condition critical-section


    【解决方案1】:

    。局部变量不跨线程共享。

    【讨论】:

    • 但请记住,本地 静态 变量是共享的,因此可能需要同步才能安全地访问它们。
    【解决方案2】:

    不,线程的局部变量不是跨线程共享的。

    具体来说,每个线程都有自己的一组寄存器和堆栈。但是,代码和全局数据是共享的。

    【讨论】:

      【解决方案3】:

      没有,因为x 是一个局部变量。每个线程都使用自己的x 变量,因此一个线程不可能修改其他线程的x

      【讨论】:

        【解决方案4】:

        不,更重要的一点是局部(自动)变量不会在函数的多个实例之间共享即使在同一个线程中。这就是递归的工作原理以及函数可重入的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-21
          • 1970-01-01
          • 2019-03-03
          • 2014-02-24
          • 2022-08-18
          • 1970-01-01
          • 2012-04-29
          相关资源
          最近更新 更多