我有thrd_create()函数:
static inline int thrd_create(thrd_t *thr,thrd_start_t func,voID *arg) { Args* args = malloc(sizeof(Args)); args->arg = arg; args->function = func; *thr = CreateThread(NulL,wrapper_function,(LPVOID) args,NulL); if (!*thr) { free (args); return thrd_error; } return thrd_success;}
该函数应该创建一个新线程,并且用户提供一个启动函数.为方便起见,我想保留调用thrd_create()的实现,如果可能的话.出于这个原因,我创建了一个wrapper_function:
static inline DWORD wrapper_function(LPVOID arg) { Args * args; args = (Args*) arg; DWORD res = args->function(args->arg); //This does obvIoUsly not work return res;}
我的问题是:我的包装函数应该返回什么DWORD?用户为pthread实现提供的函数具有voID返回类型,因此我不会从中获得任何结果.有什么建议?
编辑
Args看起来像这样:
struct Args { voID (*function)(voID * aArg); voID* arg;};typedef struct Args Args;解决方法 根据手册,最好坚持正确的签名并使用返回值:
> Windows
> Pthreads
另一个值得关注的问题是args的生命周期,我想最好的方法是让调用者清理,所以需要跟踪你的线程直到它终止.
一个近似的API可能是以下几点:
/* Your general error codes enumeration * which should probably resIDe in a general * header */typedef enum { OK = 0,// Your application specific error codes} error_t;#ifdef _WIN32 #include <windows.h> typedef HANDLE thread_handle_t;#else // assume pthreads #include <pthread.h> typedef pthread_t thread_handle_t;#endiftypedef error_t(*entry_func_t)(voID*);typedef struct { entry_func_t func; voID *args; error_t _result; thread_handle_t _handle;} thread_t;// returns OK(0) on success// returns error code indicating a problemerror_t thread_create(thread_t *t);
一个近似的实现将是:
#ifdef _WIN32 DWORD _win_entry_f(voID *args) { thread_t *t = args; t->_result = t->func(t->args); return 0; // Or some other windows-specific value } error_t thread_create(thread_t *t) { error_t err = OK; if(!(t->_handle = ThreadCreate(NulL,_win_entry_f,t,NulL))) { switch (GetLastError()) { // Populate error with code } } return err; }#else voID * _pthread_entry_f(voID *args) { thread_t *t = args; t->_result = t->func(t->args); return NulL; // Or some other pthreads specific value } error_t thread_create(thread_t *t,entry_func_t func,voID *args) { error_t err = OK; switch(pthread_create(&t->_handle,NulL,_pthread_entry_f,t)) { case 0: break; // other cases populate err } return err; }#endif
Invokation看起来有点像这样.
error_t func(voID* args) { return OK;}.....................thread_t t = { .func = func,.args = NulL };thread_create(&t);
显然你需要实现自己的取消,结果收集,加入……
总结以上是内存溢出为你收集整理的CreateThread包装函数全部内容,希望文章能够帮你解决CreateThread包装函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)