当前位置: 技术问答>linux和unix
为什么我的消息队列在线程中不阻塞?
来源: 互联网 发布时间:2016-06-10
本文导语: 在线程中读取一个消息队列中的数据,实际上这个消息队列中是没有值的,如果在进程中读取时会阻塞,一致到有消息写入为止。 但是我发现如果在线程中,这个消息队列中即使没有消息,读取的时候也不会阻塞,...
在线程中读取一个消息队列中的数据,实际上这个消息队列中是没有值的,如果在进程中读取时会阻塞,一致到有消息写入为止。
但是我发现如果在线程中,这个消息队列中即使没有消息,读取的时候也不会阻塞,而是立刻返回。而我的目标是希望他阻塞,直到有消息写入为止。
代码如下:
int ret = 0;
char buffer[8192];
printf("msgrcv starting...n");
ret = msgrcv(msg_id, buffer, 8192,0,0);
printf("msgrcv ending...n");
return ret;
正常的情况下,最后一个参数如果设置为0就会阻塞,可是线程中就不阻塞了,请知道的高手不吝赐教,谢谢。
但是我发现如果在线程中,这个消息队列中即使没有消息,读取的时候也不会阻塞,而是立刻返回。而我的目标是希望他阻塞,直到有消息写入为止。
代码如下:
int ret = 0;
char buffer[8192];
printf("msgrcv starting...n");
ret = msgrcv(msg_id, buffer, 8192,0,0);
printf("msgrcv ending...n");
return ret;
正常的情况下,最后一个参数如果设置为0就会阻塞,可是线程中就不阻塞了,请知道的高手不吝赐教,谢谢。
|
int create_msq()
{
int id;
id = msgget( (key_t) 0x9999,(IPC_CREAT|0666));
if(id == -1)
{ printf(" connect message queue failed!n"); return(-1); }
}
改为
int create_msq()
{
int id;
id = msgget( (key_t) 0x9999,(IPC_CREAT|0666));
if(id == -1)
{ printf(" connect message queue failed!n"); return(-1); }
return id; /* 加这一行 */
}