gpt4 book ai didi

CreateThread 包装函数

转载 作者:太空狗 更新时间:2023-10-29 15:41:36 26 4
gpt4 key购买 nike

我目前正在从事一个项目,我们使用 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, 0, wrapper_function, (LPVOID) args, 0, 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 返回类型,因此我不会从中得到任何结果。有什么建议吗?

编辑

参数看起来像这样:

struct Args {
void (*function)(void * aArg);
void* arg;
};
typedef struct Args Args;

最佳答案

根据手册,最好坚持正确的签名并使用返回值:

  1. Windows
  2. 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;
#endif

typedef 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 problem
error_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, 0, _win_entry_f, t, 0, 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

调用看起来有点像这样。

error_t func(void* args) {
return OK;
}

.....................

thread_t t = { .func = func, .args = NULL };
thread_create(&t);

显然,您需要实现自己的取消、结果收集、加入……

关于CreateThread 包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44774535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com