strict cstyle pthread

This commit is contained in:
tqchen 2015-04-27 22:42:01 -07:00
parent 279758a92e
commit 2eccdda3c5
2 changed files with 21 additions and 3 deletions

View File

@ -123,16 +123,33 @@ class Semaphore {
#endif
};
// helper for c thread
// used to strictly call c++ function from pthread
struct ThreadContext {
void *(*entry)(void*);
void *param;
};
extern "C" {
inline void *RunThreadContext(void *ctx_) {
ThreadContext *ctx = reinterpret_cast<ThreadContext*>(ctx_);
void *ret = (*ctx->entry)(ctx->param);
delete ctx;
return ret;
}
}
/*!\brief simple thread class */
class Thread {
private:
pthread_t thread;
public :
inline void Start(void * entry(void*), void *param) {
inline void Start(void *entry(void*), void *param) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&thread, &attr, entry, param);
ThreadContext *ctx = new ThreadContext();
ctx->entry = entry; ctx->param = param;
pthread_create(&thread, &attr, RunThreadContext, ctx);
}
inline int Join(void) {
void *status;
@ -142,6 +159,7 @@ class Thread {
inline void ThreadExit(void *status) {
pthread_exit(status);
}
} // namespace utils
} // namespace xgboost
#define XGBOOST_THREAD_PREFIX void *

View File

@ -167,7 +167,6 @@ class ThreadBuffer {
/*!\brief entry point of loader thread */
inline static XGBOOST_THREAD_PREFIX LoaderEntry(void *pthread) {
static_cast< ThreadBuffer<Elem,ElemFactory>* >(pthread)->RunLoader();
ThreadExit(NULL);
return NULL;
}
/*!\brief start loader thread */
@ -199,6 +198,7 @@ class ThreadBuffer {
loading_need.Post();
}
};
} // namespace utils
} // namespace xgboost
#endif