i具有获取核心转储错误的follwing代码。每个C实例都会创建自己的线程,然后运行。我想静态函数和类参数"计数"有问题。当我评论打印它的代码时,不会发生任何故障。
#include <iostream>
#include <pthread.h>
using namespace std;
class C {
public:
int count;
C(int c_): count(c_){}
public:
void *hello(void)
{
std::cout << "Hello, world!" <<std::endl;
std::cout<<count; // bug here!!!
return 0;
}
static void *hello_helper(void *context)
{
return ((C *)context)->hello();
}
void run() {
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, NULL);
}
};
int main() {
C c(2);
c.run();
C c2(4);
c2.run();
while(true);
return 0;
}
决定写答案。您是根据如何创建线程来使用NULL
的context
调用hello_helper
。C 完全允许您在空指针上调用成员功能,除非访问成员元素,否则不会发生错误。
在您的情况下,将行添加到打印count
。您现在正在访问Null指针上的成员变量,这是一个很大的禁忌。
这是您要摆脱的示例:
#include <iostream>
class Rebel
{
public:
void speak()
{
std::cout << "I DO WHAT I WANT!" << std::endl;
}
};
int main()
{
void * bad_bad_ptr = NULL;
((Rebel*)bad_bad_ptr)->speak();
}
输出:
I DO WHAT I WANT!
通过修改您的pthread_create
调用以传递this
指针(即pthread_create(&t, NULL, &C::hello_helper, this);
,您现在有一个有效的实例来访问成员变量。
i通过在创建线程时将该指针从空中传递到null来解决问题。我猜操作系统创建了同一线程两倍以前的情况?