変数が定義する順序を変更すると、プログラムがクラッシュする。 私は期待どおり、このためには、それが実行されます:異なる順序で変数を定義するとクラッシュする
class xThread
{
public:
xThread();
virtual ~xThread() {}
bool thread_start();
virtual bool thread_init(){return true;}
virtual void thread_stop();
void thread_setState(ThreadState s) {state = s;}
ThreadState thread_getState(){return state;}
static void *thread_run(void *param);
void setName(const char *n);
char name[MAX_NAMESIZE];
protected:
volatile ThreadState state;
virtual void thread_proc()=0;
private:
pthread_t pid;
};
を、私は、変数「名」と「状態」の定義順序を変更した場合、それがクラッシュします:
class xThread
{
public:
xThread();
virtual ~xThread() {}
bool thread_start();
virtual bool thread_init(){return true;}
virtual void thread_stop();
void thread_setState(ThreadState s) {state = s;}
ThreadState thread_getState(){return state;}
static void *thread_run(void *param);
void setName(const char *n);
protected:
volatile ThreadState state;
virtual void thread_proc()=0;
private:
pthread_t pid;
char name[MAX_NAMESIZE];
};
ここでGDBがありますスタック、それは私がスレッドを開始する前に、各thread.Itが定義されているlableに使用する変数がある
0 0x00007f34dfaeff72 in _int_malloc() from /lib64/libc.so.6
1 0x00007f34dfaf187c in malloc() from /lib64/libc.so.6
2 0x00007f34e03aa0cd in operator new(unsigned long)() from /lib64/libstdc++.so.6
3 0x00007f34e15d93b1 in log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<log4cxx::Level> const&, std::string const&, log4cxx::spi::LocationInfo const&) const() from /lib64/liblog4cxx.so.10
4 0x000000000081e615 in xServer::v_final (this=0x19921b0) at xlib/xServer.cpp:112
5 0x000000000082218c in xServer::run (this=0x19921b0) at xlib/xServer.cpp:411
6 0x00000000007b2ebc in main (argc=4, argv=0x7fff46d5f258) at SceneServer.cpp:152
「名前」奇妙に見える、それは時にスレッドterminateed印刷されます。
main.cppに:
HttpClientThread client;
client.setName("HttpClientThread ");
client.thread_start();
xThread.cpp:
xThread::xThread()
{
thread_setState(THREAD_INIT);
bzero(name, sizeof(name));
pid = 0;
}
xThread::~xThread()
{
LOG4CXX_DEBUG(::log4cxx::Logger::getLogger("main"), name);
}
void xThread::setName(const char *n)
{
if (!n) return;
bzero(name, sizeof(name));
strncpy(name, n, MAX_NAMESIZE-1);
}
bool xThread::thread_start()
{
if (!thread_init()) return false;
int ret = pthread_create(&pid, NULL, &thread_run, (void *)this);
if (ret == 0)
{
return true;
}
else
{
return false;
}
}
void xThread::thread_stop()
{
if (thread_getState()==THREAD_INIT)
thread_setState(THREAD_FINISH);
if (thread_getState()==THREAD_RUN)
thread_setState(THREAD_STOP);
}
void *xThread::thread_run(void *param)
{
xThread *t = (xThread *)param;
t->thread_proc();
t->thread_setState(THREAD_FINISH);
return 0;
}
デバッガ、gdb、または小さな動作例の出力を投稿することはできますか? – Roby
これは 'xThread()'がどのように定義されているかに依存します。初期化おそらく 'name []'はその前に宣言されている変数によって使用されています。コンストラクタの定義を投稿します。 – iammilind
xThread.cppのソースコードを所有していて、それをプロジェクトでコンパイルしていますか?または、ライブラリを使用していますか?投稿されたスニペット(変更しようとしているもの)は、ライブラリと一緒に配布されているヘッダーのコピーですか? –