C++ 使用gmock模拟pthread_创建

C++ 使用gmock模拟pthread_创建,c++,gmock,C++,Gmock,我有一个方法调用pthread_create。。。。可以模拟并期望pthread_create的输出,这样我就不会实际启动线程了吗 我这样问是因为整个类都是一个模拟对象,一旦我在测试用例末尾删除了这个对象,线程段就会被删除。是的。声明模拟类和函数: struct phtread_interface { virtual int pthread_create(...) = 0; ... // other methods }; class pthread_mock : public

我有一个方法调用pthread_create。。。。可以模拟并期望pthread_create的输出,这样我就不会实际启动线程了吗


我这样问是因为整个类都是一个模拟对象,一旦我在测试用例末尾删除了这个对象,线程段就会被删除。

是的。声明模拟类和函数:

struct phtread_interface
{
    virtual int pthread_create(...) = 0;
    ... // other methods
};

class pthread_mock : public phtread_interface
{
public:
    MOCK_METHOD1(pthread_create, int(...));
    ....
};

pthread_interface *current_pthread_mock;

void set_current_pthread_mock(phtread_interface *mock)
{
    current_pthread_mock = mock;
}

int pthread_create(...)
{
    return current_pthread_mock->pthread_create(...);
}
在每个测试功能中,执行以下操作:

pthread_mock mock_obj;
set_current_pthread_mock(&mock_obj);

// set expectations over mock_obj, use pthread_create ...    
在带有pthread_create的源文件中添加条件include,如:

#ifndef TESTING
#include <pthread.h>
#else
#include "pthread_mock.h"
#endif

对。声明模拟类和函数:

struct phtread_interface
{
    virtual int pthread_create(...) = 0;
    ... // other methods
};

class pthread_mock : public phtread_interface
{
public:
    MOCK_METHOD1(pthread_create, int(...));
    ....
};

pthread_interface *current_pthread_mock;

void set_current_pthread_mock(phtread_interface *mock)
{
    current_pthread_mock = mock;
}

int pthread_create(...)
{
    return current_pthread_mock->pthread_create(...);
}
在每个测试功能中,执行以下操作:

pthread_mock mock_obj;
set_current_pthread_mock(&mock_obj);

// set expectations over mock_obj, use pthread_create ...    
在带有pthread_create的源文件中添加条件include,如:

#ifndef TESTING
#include <pthread.h>
#else
#include "pthread_mock.h"
#endif

模拟对象的析构函数是否执行与线程相关的操作?它不应该只是segfault,因为它的构造对象已不存在。是的,析构函数会删除线程所需的本地信息,这可能是导致问题的原因-线程正在尝试访问您删除的数据。您应该向线程发送某种退出信号,然后等待它完成pthread_join操作,然后再删除其数据。模拟对象的析构函数是否执行与线程相关的操作?它不应该只是segfault,因为它的构造对象已不存在。是的,析构函数会删除线程所需的本地信息,这可能是导致问题的原因-线程正在尝试访问您删除的数据。您应该向线程发送某种退出信号,然后等待它完成pthread_join,然后再删除其数据。