CreateThread包装函数

CreateThread包装函数,第1张

概述我目前正在开发一个项目,我们使用pthreads为UNIX系统提供C线程实现.现在我们希望能够在 Windows上运行整个项目,我正在翻译WIN32的所有线程.现在我遇到了一个问题,我无法想出一个像样的解决方案. 我有thrd_create()函数: static inline int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { 我目前正在开发一个项目,我们使用pthreads为UNIX系统提供C线程实现.现在我们希望能够在 Windows上运行整个项目,我正在翻译WIN32的所有线程.现在我遇到了一个问题,我无法想出一个像样的解决方案.

我有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包装函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存