int main()
{
int i;
pthread_t t;
}
不能看到我吗? t是在主内部创建的,对吗?这意味着它必须使用相同的共享内存main()正在使用?我如何让它看到我而不让我成为一个全局变量?无法从main()函数中访问变量?
int main()
{
int i;
pthread_t t;
}
不能看到我吗? t是在主内部创建的,对吗?这意味着它必须使用相同的共享内存main()正在使用?我如何让它看到我而不让我成为一个全局变量?无法从main()函数中访问变量?
什么? 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";
}
}
并行线程不是特殊。例如,下面的代码有同样的“问题”:
void foo()
{
i = 5;
}
int main()
{
int i;
foo();
}
当然foo
被称为main
,所以他们即使是在同一个线程。然而foo
没有在main
中看到int
。解决方法很简单:如果foo
需要一个int
,main
应该传递:
void foo(int& i)
{
i = 5;
}
int main()
{
int i;
foo(i);
}
随着线程,情况是一样的:通过你需要共享的内容。
那么......你可以将`&i`作为参数传递给线程,将它放入线程函数的作用域。 – 2010-11-26 01:06:34