gpt4 book ai didi

c++ - android + pthread + c++ = SIGSEGV

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:00 25 4
gpt4 key购买 nike

以下代码在标准 linux 上编译并运行:

#include <iostream>
#include <pthread.h>

using namespace std;

class Foo
{
public:
Foo();
void go_thread();
void stop_thread();
private:
static void* worker( void* param );
pthread_t m_pt;
};

Foo::Foo()
{
m_pt = 0;
}

void Foo::go_thread()
{
int success = pthread_create( &m_pt, NULL, worker, static_cast<void*>(this) );

if( success == 0 )
{
cout << "thread started" << endl;
}
}

void Foo::stop_thread()
{
int success = pthread_join( m_pt, NULL );

if( success == 0 )
{
cout << "thread stopped" << endl;
}
}

void* Foo::worker( void* p )
{
cout << "thread running" << endl;
return 0;
}

int main()
{
Foo f;
f.go_thread();
f.stop_thread();
return 0;
}

并产生以下输出:

$ ./a.out
thread started
thread running
thread stopped
$

此代码还使用 Android NDK (r5b) 构建。但是,当我将生成的可执行文件推送到设备并运行它时,我在 main() 运行之前就收到了一个 SIGSEGV。我已将问题隔离到 pthread_create() 似乎我的代码中仅存在此调用,更不用说执行,导致我的 prog 出现段错误。有什么想法吗?

最佳答案

可能不是这样,但尝试让 pthread 调用的函数创建一个普通的 c 函数(即声明为 extern "C")而不是静态成员函数:

这是因为从技术上讲,静态成员的调用约定可能不同于 C 库 pthread 使用的 C 调用约定(尽管很多时候它们是相同的(这就是它在您的 linux 上工作的原因框)在我看来不值得冒移植风险)。

extern "C" void* start_the_thread(void*);

void* start_the_thread(void* data)
{
Foo* theObject = static_cast<Foo*>(data);
// In Java if your Foo had been derived from Runable
// This is s where theObject->run() would have been called.
return Foo::worker(data);
}

int success = pthread_create( &m_pt, NULL, start_the_thread, static_cast<void*>(this)

关于c++ - android + pthread + c++ = SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com