在课堂上使用pthreads时出现分段错误

时间:2016-12-01 20:27:04

标签: c++ pthreads coredump

我有以下代码获取核心转储错误。每个C实例创建自己的线程然后运行。我猜静态函数和类参数有问题" count"。当我注释掉打印它的代码时,没有发生错误..

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

2 个答案:

答案 0 :(得分:1)

决定写一个答案。根据您创建主题的方式,您使用hello_helper contextNULL调用count。 C ++完全允许您在空指针上调用成员函数,除非访问成员元素,否则不会发生错误。

在您的情况下,通过添加行来打印#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);指针(即Declare @YourTable Table (ID int,YourField varchar(500)) Insert Into @YourTable values (1,'bob hope deloris steve mike'), (2,'melbob melbetty steve') Select A.ID ,AnswerA = Count(*) ,AnswerB = Sum(case when RetVal Like 'mel%' then 1 else 0 end) From @YourTable A Cross Apply ( Select RetSeq = Row_Number() over (Order By (Select null)) ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) From (Select x = Cast('<x>'+ Replace(A.YourField,' ','</x><x>')+'</x>' as xml).query('.')) as A Cross Apply x.nodes('x') AS B(i) ) B Group By ID ),您现在拥有一个有效的实例来访问成员变量。

答案 1 :(得分:-1)

我通过在创建线程时将此指针传递给NULL来解决问题。我猜os在前一种情况下两次创建了相同的线程?