【发布时间】:2017-11-30 04:02:16
【问题描述】:
我目前正在从事一个项目,我们使用 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 返回类型,因此我不会从中得到任何结果。有什么建议吗?
编辑
Args 看起来像这样:
struct Args {
void (*function)(void * aArg);
void* arg;
};
typedef struct Args Args;
【问题讨论】:
-
什么是
Args? -
为什么不直接返回零呢? Windows 实际并未使用线程返回的值。这不是类似于您已经对 pthreads 所做的事情吗(因为 pthreads 线程函数返回
void *)? -
@Someprogrammerdude 我认为你刚刚打破了我和解决方案之间的墙。你是对的,如果有的话,返回值会引起用户的兴趣。而用户是……我。
-
@ZerO 您使用的是哪个编译器和版本?
标签: c multithreading winapi