2010-11-26 67 views

回答

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"; 
    } 
} 
+0

那么......你可以将`&i`作为参数传递给线程,将它放入线程函数的作用域。 – 2010-11-26 01:06:34

3

并行线程不是特殊。例如,下面的代码有同样的“问题”:

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

当然foo被称为main,所以他们即使是在同一个线程。然而foo没有在main中看到int。解决方法很简单:如果foo需要一个intmain应该传递:

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

随着线程,情况是一样的:通过你需要共享的内容。