【问题标题】:Memory access in pthreadspthread 中的内存访问
【发布时间】:2016-03-12 12:42:33
【问题描述】:

我正在编写一个涉及运行多个线程的单元测试,但遇到了一个我似乎无法理解的内存访问问题。

这是原始(伪)代码:

void thread_func(void * err) {
    /*foo will return an allocated error_type if error occurs else NULL*/
    err = (void *) foo(...)
    pthread_exit(NULL);
}

void unit_test() {
    int i = 0;
    err_type *err_array[10];
    pthread_t threads[10];
    for (i = 0; i < 10; i++) {
         pthread_create(&(threads[i]), NULL, thread_func, (void *) err_array[i]);
    }
    for(i = 0; i < 10; i++) {
         pthread_join(threads[i], NULL);
         ASSERT_NULL(err_array[i]);
     }
}

我感到困惑的是所有线程都将返回 NULL(使用 gdb 检查),但是 err_array[1] 和 err_array[5] 将不是 NULL。而不是有效的 err_type,它们将包含垃圾。在 err_array[1] 的情况下将包含 unit_test 文件路径的字符串,而 err_array[5] 将包含一堆访问越界地址。

我发现的一种解决方法是使用全局 err_array,并将每个元素的索引传递给线程。以及将数组的所有元素初始化为 NULL。

我的问题是为什么上述两种方法有效,而不是原始代码?

【问题讨论】:

    标签: c multithreading memory concurrency pthreads


    【解决方案1】:

    err 变量是 thread_func 的本地变量。当thread_func 返回时,它超出了范围。您需要向线程传递一个指向您希望它修改的事物的指针,而不是您希望它修改的事物的当前值。

    所以:

    void thread_func(void ** err) {
        /*foo will return an allocated error_type if error occurs else NULL*/
        *err = (void *) foo(...)
        pthread_exit(NULL);
    }
    

    还有:

         pthread_create(&(threads[i]), NULL, thread_func, (void **) &err_array[i]);
    

    【讨论】:

      猜你喜欢
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2019-01-08
      • 2018-01-13
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多