无法从main()函数pthreads访问变量?

时间:2010-11-26 01:04:08

标签: c++ pthreads

int main()
{
   int i; 
   pthread_t t; 
}

看不到我?在主要内部创建,对吧?这意味着它必须使用相同的共享内存main()正在使用?如何在不使我成为全局变量的情况下让它看到我?

2 个答案:

答案 0 :(得分:5)

什么? t是一个线程,它并没有真正“看到”任何东西。严格来说,它是一个代表线程的变量 - 你实际上并没有创建一个线程 - 但假设你创建了一个线程,它在与main()相同的进程中运行,所以它在这个意义上共享内存空间,但它不分享主要的范围。在该线程中运行的函数可以看到这些函数的范围内的变量。

您可以将指针传递给i作为pthread_create的用户数据指针。或者,如果您需要访问的不仅仅是i,您可以将指针传递给某个结构,该结构包含(除其他外)指向i的指针,依此类推。

示例代码:

#include <pthread.h>
#include <iostream>
#include <cstring>

void *thread_entry_point(void *data) {
    int *idata = static_cast<int*>(data);
    std::cout << "thread: i = " << *idata << "\n";
    *idata = 23;
    return const_cast<char*>("might as well return something");
}

int main() {
    int i = 12;
    pthread_t thr;

    int err = pthread_create(&thr, 0, thread_entry_point, &i);
    if (err == 0) {
        void *result;
        pthread_join(thr, &result);

        std::cout << "main: result = " << static_cast<const char*>(result) << "\n";
        std::cout << "main: i = " << i << "\n";
    } else {
        std::cout << "error creating thread: " << err << " " << std::strerror(err) << "\n";
    }
}

答案 1 :(得分:3)

pthreads并不特别。例如,以下代码具有相同的“问题”:

void foo()
{
  i = 5;
}
int main()
{
   int i; 
   foo();
}

肯定foomain调用,所以他们甚至在同一个帖子上。但是foo却没有在int中看到main。解决方案很简单:如果foo需要intmain应该通过:{/ p>

void foo(int& i)
{
  i = 5;
}
int main()
{
   int i; 
   foo(i);
}

对于线程,情况是相同的:传递您需要共享的内容。