在类中使用pthreads时分割故障



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;
    }

决定写答案。您是根据如何创建线程来使用NULLcontext调用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来解决问题。我猜操作系统创建了同一线程两倍以前的情况?

相关内容

  • 没有找到相关文章

最新更新