현재 MSVC에서 개발 된 리눅스에 우리의 C++ Qt 응용 프로그램을 포팅하고 있으며 일부 스레딩 작업이 멈추지 않습니다. 창문에서는 모든 것이 잘 작동합니다.boost :: thread :: join 리눅스 응용 프로그램 동결
thread.h :
class our_thread
{
public:
our_thread();
~our_thread();
void run(boost::thread*);
void join(const char* = 0);
inline bool is_running() const;
private:
void delete_thread();
bool thread_is_running;
boost::thread* thread_object;
};
thread.cpp :
void our_thread::run(boost::thread* t)
{
this->delete_thread();
this->thread_object = t;
this->thread_is_running = true;
QApplication::setOverrideCursor(Qt::BusyCursor);
plot("in run");
}
void our_thread::join(const char* text)
{
plot("in join");
if(this->thread_object == 0) { return; }
this->thread_is_running = false;
QApplication::restoreOverrideCursor();
if(text)
{
plot(text);
}
progress.show(false);
this->thread_object->join();
this->delete_thread();
}
void our_thread::delete_thread()
{
this->thread_is_running = false;
delete this->thread_object;
this->thread_object = 0;
}
및 예를 들어 전화 :
우리의 스레드 구현은 다음 코드 (발췌)를 사용this->do_something_thread.run(new boost::thread(&function_name, this, param1));
...
this->do_something_thread.join("Part creation finished");
plot()
호출은 사용자 정보이지만 디버그 출력에도 사용됩니다.
일부 작업의 경우이 절차가 항상 작동합니다. 스레드의 코드가 모두 끝나고 join()
이 호출되면 항상이 프로그램이 고정됩니다. 소프트웨어를 디버깅하고 코드를 단계별로 실행하면 스레드를 다시 사용할 때까지 완벽하게 작동합니다. 그런 다음 run()
전화로 바로 연결됩니다.
아무런 차이없이 1.39.0과 1.49.0을 시험해 보았습니다. 우리는 RedHat 5.4를 사용하고 있으며 모든 것은 gcc44로 컴파일됩니다.
편집 : 나는이 모든 것이 간단한 코드 오류라고 생각하지 않기 때문에 모든 것이 창에서 제대로 작동한다는 것을 강조하고 싶습니다. 일부 컴파일러 특정 설정이나 플래그 또는 그와 같은 버그를 만들 수 있습니다 뭐든 리눅스 특정 일을 더 비슷합니다.
'this-> thread_object-> run()'을 호출하지 마십시오. thread_is_running의 목적은 무엇입니까? – UmNyobe
** ** 모든 ** 동기화 프리미티브를 사용합니까? 하나의 예제처럼,'thread_is_running' 부울에 적용 할 수있는 컴파일러 최적화와 메모리 모델이 무엇인지 어떻게 알 수 있습니까? – mockinterface
@mockinterface "thread_is_running"값은 호출자에게만 건드립니다. 따라서 "our_thread"객체가 항상 동일한 스레드에서 액세스되는 경우 왜 동기화가 수행됩니까? 어쨌든'thread_is_running'은이 코드의 쓰기 전용 변수입니다. – sehe