我的代码有问题。

我的这个客户带有posix队列。是与conc服务器进行的posix队列通信。
问题已经解决了。

mqd_t server;
mqd_t client;
struct request req; //char *name, int pos, int op...
struct reply rep; //int num, int ret...
struct mq_attr attr;

attr.mq_maxmsg = 1;
attr.mq_msgsize = sizeof(struct reply);
client = mq_open("/CLIENT", O_CREAT|O_RDONLY, 0700, &attr);
server = mq_open("/SERVER", O_WRONLY);


req.name = name;
req.op = 3;

mq_send (server, (const char *) &req, sizeof(struct req),0);
mq_receive(client, (char*)&rep, sizeof(struct reply), 0);

mq_close(server);
mq_close(client);
mq_unlink("/CLIENT");


而这个服务器

struct db mydb[100]; //Struct with char*name....
  for (int i = 0; i<100;i++){
  strcpy(mydb[i].name,"");
  mydb[i].vec =NULL;
  mydb[i].size =0;
}

mqd_t server;

struct request mess;
struct mq_attr q_attr;
pthread_attr_t t_attr;

q_attr.mq_maxmsg = 10;
q_attr.mq_msgsize=sizeof(struct request);
server = mq_open ("/SERVER", O_CREAT|O_RDONLY, 0700, &q_attr);
  if (server == -1){
  perror("Er");
}

pthread_mutex_init (&mutex_msj, NULL);
pthread_cond_init (&cond_msj, NULL);
pthread_attr_init(&t_attr);

pthread_attr_setdetachstate(&t_attr, PTHREAD_CREATE_DETACHED);

while(1){
  pthread_t thid;

mq_receive(server, (char*) &mess, sizeof(struct request), 0);


问题就在这里。当我印制MESS.OP时,我会收到“ 3”。我分配给客户的号码。当我这样做时,mess.op的值为0,而不是3。

pthread_create(&thid, &t_attr, (void*)func, &mess);
...
...
...
...

}


谢谢。

最佳答案

似乎您正在使用本地(or automatic)变量pthread_create()调用mess,该变量有时在实际启动线程之前被释放。您需要在堆上分配mess,并非常小心在适当的时间释放它。

另外(void *) func看起来也不正确,因为,


正确的类型是void *(*)(void *)


并且看起来好像您是在忽略编译警告,还是通过随机地将指针强制转换为编译器建议的类型来迫使它们消失。

10-06 03:39