我正在使用自定义线程api,我想生成一个带有两个指向消息通道和整数的新线程。
spawn_thread(Proctype Procedure, int argc, char *argv[]);
我使用'渠道'作为线程之间的共享区域。
我有三个变量: `Chan * return,Chan * receive and an int n'
我可以简单地将我想要存储在* argv []中的所有值转换为字符吗? 我没有这样做的原因是char的宽度只有8位,因此最大值为255,这不足以保持指针或大值。
答案 0 :(得分:2)
将异构数据存储在C数组中的一种常见方法是使用带标记的联合:
typedef enum {chDataReturn, chDataReceive, chDataInt} ChannelDataType;
struct ChannelData {
ChannelDataType type;
union {
ChanReturn ret;
ChanReceive rcv;
int num;
} data;
};
现在您的spawn_thread
原型看起来如下:
spawn_thread(Proctype Procedure, int argc, struct ChannelData *argv);
用户会将数据放入argv
s的数组中,“标记”每个项目的类型,如下所示:
struct ChannelData *data = malloc(3*sizeof(struct ChannelData));
data[0].type = chDataReturn;
data[0].data.ret = myReturn;
data[1].type = chDataReceive;
data[1].data.ret = myReceive;
data[2].type = chDataInt;
data[3].data.num = 12345;
spawn_thread(myProc, 3, data);
// Wait for the thread to finish, and then...
...
free(data);
答案 1 :(得分:1)
char * argv[]
传递char **
,您可以轻松地投射到void **
,基本上允许您将void *
数组传递给您喜欢的任何内容。
char * argv[] = {&return, &receive, &n};
spawn_thread(Procedure, 3, argv);
Procedure(int argc, char *argv[]) {
char return = *argv[0];
char receive = *argv[1];
int return = *(int *)argv[2];
// ...
}