[英]Are IPC Unix Message Queue Thread Safe?
I made below code, to understand the thread safety of message queue in Linux. 我在下面的代码中,了解了Linux中消息队列的线程安全性。 But not sure why the program is getting stuck. 但不确定该程序为什么会卡住。 Though after applying proper locks it doesn't stuck .But if message queues are thread safe then why the program is getting stuck .Or am I missing a trick there? 虽然在应用正确的锁之后它不会卡住。但是如果消息队列是线程安全的,那么为什么程序会卡住。或者我在那里错过了一个技巧? Little Help or Suggestion will help deeply. 小帮助或建议将有助于深入。
#include <cstdio>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdlib>
#include <cstring>
#include <errno.h>
#include <iostream>
#include <string>
#include <thread>
using namespace std;
struct mesg_buffer // MQ Structure
{
long mesg_type;
char mesg_text[100];
};
class MQ_Wrapper // Wrapper class
{
key_t key;
int msgid;
public:
MQ_Wrapper()
{
key = ftok("progfiles_other", 65); // creating key
msgid = msgget(key, 0666 | IPC_CREAT ); // creating message
// queue id
}
~MQ_Wrapper() // removing mqueue in destructor
{
remove_queue();
}
void remove_queue() // removing m queue
{
msgctl(msgid, IPC_RMID, NULL);
}
bool receive_message() // For receiving mesd
{
mesg_buffer message;
if( msgrcv(msgid, &message, sizeof(message), 0, IPC_NOWAIT) != -1 )
{
printf("Data Received is : %s \n",message.mesg_text);
}
else
{
printf("Receving Failed : "); //p
return false;
}
return true;
}
void send_message(int count)
{
mesg_buffer message;
message.mesg_type = count;
char str[25];
sprintf(str,"Hello Friends %ld",message.mesg_type);
strcpy(message.mesg_text,str);
if (msgsnd(msgid, &message, sizeof(message), 0) == 0)
{
printf("Data send is : %s \n", message.mesg_text);
// getting stuck here
}
else
{
printf("Sending Failed\n");
}
}
};
MQ_Wrapper mq; // Global object
// all local variables used
void send_func(bool status)
{
for(int i = 1 ; i < 501 ; i++)
{
if(i%2 == status)
mq.send_message(i);
}
}
void receive_func()
{
while(1) // infinite loop
{
if (mq.receive_message() == false)
break;
}
}
int main()
{
thread send1(send_func,true); // thread 1
thread send2(send_func,false); // thread 2
thread receive1(receive_func); // thread 3
thread receive2(receive_func); // thread 4
send1.join();
send2.join();
receive1.join();
receive2.join();
return 0;
}
Below is the short output end 以下是短输出端
FULL OUTPUT:
============
Data send is : Hello Friends 2
Data send is : Hello Friends 4
Data send is : Hello Friends 6
Data send is : Hello Friends 8
Data send is : Hello Friends 10
Data send is : Hello Friends 12
Data send is : Hello Friends 14
Data send is : Hello Friends 16
Data send is : Hello Friends 18
Data send is : Hello Friends 20
Data send is : Hello Friends 22
Data send is : Hello Friends 24
Data send is : Hello Friends 26
Data send is : Hello Friends 28
Data send is : Hello Friends 30
Data send is : Hello Friends 32
Data send is : Hello Friends 34
Data send is : Hello Friends 36
Data send is : Hello Friends 38
Data send is : Hello Friends 40
Data send is : Hello Friends 42
Data send is : Hello Friends 44
Data send is : Hello Friends 46
Data send is : Hello Friends 48
Data send is : Hello Friends 50
Data send is : Hello Friends 52
Data send is : Hello Friends 54
Data send is : Hello Friends 56
Data send is : Hello Friends 58
Data send is : Hello Friends 60
Data send is : Hello Friends 62
Data send is : Hello Friends 64
Data send is : Hello Friends 66
Data send is : Hello Friends 68
Data send is : Hello Friends 166
Data send is : Hello Friends 168
Data send is : Hello Friends 170
Data send is : Hello Friends 172
Data send is : Hello Friends 174
Data send is : Hello Friends 176
Data send is : Hello Friends 178
Data send is : Hello Friends 180
Data send is : Hello Friends 182
Data send is : Hello Friends 184
Data send is : Hello Friends 186
Data send is : Hello Friends 188
Data send is : Hello Friends 190
Data send is : Hello Friends 192
Data send is : Hello Friends 194
Data send is : Hello Friends 196
Data send is : Hello Friends 198
Data send is : Hello Friends 200
Data send is : Hello Friends 202
Data send is : Hello Friends 204
Data send is : Hello Friends 206
Data send is : Hello Friends 208
Data send is : Hello Friends 210
Data send is : Hello Friends 212
Data send is : Hello Friends 214
Data send is : Hello Friends 216
Data send is : Hello Friends 218
Data send is : Hello Friends 220
Data send is : Hello Friends 222
Data send is : Hello Friends 224
Data send is : Hello Friends 226
Data send is : Hello Friends 228
Data send is : Hello Friends 230
Data send is : Hello Friends 232
Data send is : Hello Friends 234
Data send is : Hello Friends 236
Data send is : Hello Friends 238
Data send is : Hello Friends 240
Data send is : Hello Friends 242
Data send is : Hello Friends 244
Data send is : Hello Friends 246
Data send is : Hello Friends 248
Data send is : Hello Friends 250
Data send is : Hello Friends 252
Data send is : Hello Friends 254
Data send is : Hello Friends 256
Data send is : Hello Friends 258
Data send is : Hello Friends 260
Data send is : Hello Friends 262
Data send is : Hello Friends 264
Data send is : Hello Friends 266
Data send is : Hello Friends 268
Data send is : Hello Friends 270
Data send is : Hello Friends 272
Data send is : Hello Friends 274
Data send is : Hello Friends 276
Data send is : Hello Friends 278
Data send is : Hello Friends 280
Data send is : Hello Friends 282
Data send is : Hello Friends 284
Data send is : Hello Friends 286
Data send is : Hello Friends 288
Data send is : Hello Friends 290
Data send is : Hello Friends 292
Data Received is : Hello Friends 2
Data Received is : Hello Friends 4
Data Received is : Hello Friends 6
Data Received is : Hello Friends 8
Data Received is : Hello Friends 10
Data Received is : Hello Friends 12
Data Received is : Hello Friends 14
Data Received is : Hello Friends 16
Data Received is : Hello Friends 18
Data Received is : Hello Friends 20
Data Received is : Hello Friends 22
Data Received is : Hello Friends 24
Data Received is : Hello Friends 26
Data Received is : Hello Friends 28
Data Received is : Hello Friends 30
Data Received is : Hello Friends 32
Data Received is : Hello Friends 34
Data Received is : Hello Friends 36
Data Received is : Hello Friends 38
Data Received is : Hello Friends 40
Data Received is : Hello Friends 42
Data Received is : Hello Friends 44
Data Received is : Hello Friends 46
Data Received is : Hello Friends 48
Data Received is : Hello Friends 50
Data Received is : Hello Friends 52
Data Received is : Hello Friends 54
Data Received is : Hello Friends 56
Data Received is : Hello Friends 58
Data Received is : Hello Friends 60
Data Received is : Hello Friends 62
Data Received is : Hello Friends 64
Data Received is : Hello Friends 66
Data Received is : Hello Friends 68
Data Received is : Hello Friends 70
Data Received is : Hello Friends 72
Data Received is : Hello Friends 74
Data Received is : Hello Friends 76
Data Received is : Hello Friends 78
Data Received is : Hello Friends 80
Data Received is : Hello Friends 82
Data Received is : Hello Friends 84
Data Received is : Hello Friends 86
Data Received is : Hello Friends 88
Data Received is : Hello Friends 90
Data Received is : Hello Friends 92
Data Received is : Hello Friends 94
Data Received is : Hello Friends 96
Data Received is : Hello Friends 98
Data Received is : Hello Friends 100
Data Received is : Hello Friends 102
Data Received is : Hello Friends 104
Data Received is : Hello Friends 106
Data Received is : Hello Friends 108
Data Received is : Hello Friends 110
Data Received is : Hello Friends 112
Data Received is : Hello Friends 114
Data Received is : Hello Friends 116
Data Received is : Hello Friends 118
Data Received is : Hello Friends 120
Data Received is : Hello Friends 122
Data Received is : Hello Friends 124
Data Received is : Hello Friends 126
Data Received is : Hello Friends 128
Data Received is : Hello Friends 130
Data Received is : Hello Friends 132
Data Received is : Hello Friends 134
Data Received is : Hello Friends 136
Data Received is : Hello Friends 138
Data Received is : Hello Friends 140
Data Received is : Hello Friends 142
Data Received is : Hello Friends 144
Data Received is : Hello Friends 146
Data Received is : Hello Friends 148
Data Received is : Hello Friends 150
Data Received is : Hello Friends 152
Data Received is : Hello Friends 154
Data Received is : Hello Friends 156
Data Received is : Hello Friends 158
Data Received is : Hello Friends 160
Data Received is : Hello Friends 162
Data Received is : Hello Friends 164
Data Received is : Hello Friends 166
Data Received is : Hello Friends 168
Data Received is : Hello Friends 170
Data Received is : Hello Friends 172
Data Received is : Hello Friends 174
Data Received is : Hello Friends 176
Data Received is : Hello Friends 178
Data Received is : Hello Friends 180
Data Received is : Hello Friends 182
Data Received is : Hello Friends 184
Data Received is : Hello Friends 186
Data Received is : Hello Friends 188
Data Received is : Hello Friends 190
Data Received is : Hello Friends 192
Data Received is : Hello Friends 194
Data Received is : Hello Friends 196
Data Received is : Hello Friends 198
Data Received is : Hello Friends 200
Data Received is : Hello Friends 202
Data Received is : Hello Friends 204
Data Received is : Hello Friends 206
Data Received is : Hello Friends 208
Data Received is : Hello Friends 210
Data Received is : Hello Friends 212
Data Received is : Hello Friends 214
Data Received is : Hello Friends 216
Data Received is : Hello Friends 218
Data Received is : Hello Friends 220
Data Received is : Hello Friends 222
Data Received is : Hello Friends 224
Data Received is : Hello Friends 226
Data Received is : Hello Friends 228
Data Received is : Hello Friends 230
Data Received is : Hello Friends 232
Data Received is : Hello Friends 234
Data Received is : Hello Friends 236
Data Received is : Hello Friends 238
Data Received is : Hello Friends 240
Data Received is : Hello Friends 242
Data Received is : Hello Friends 244
Data Received is : Hello Friends 246
Data Received is : Hello Friends 248
Data Received is : Hello Friends 250
Data Received is : Hello Friends 252
Data Received is : Hello Friends 254
Data Received is : Hello Friends 256
Data Received is : Hello Friends 258
Data Received is : Hello Friends 260
Data Received is : Hello Friends 262
Data Received is : Hello Friends 264
Data Received is : Hello Friends 266
Data Received is : Hello Friends 268
Data Received is : Hello Friends 270
Data Received is : Hello Friends 272
Data Received is : Hello Friends 274
Data Received is : Hello Friends 276
Data Received is : Hello Friends 278
Data Received is : Hello Friends 280
Data Received is : Hello Friends 282
Data Received is : Hello Friends 284
Data Received is : Hello Friends 286
Data Received is : Hello Friends 288
Data Received is : Hello Friends 290
Data Received is : Hello Friends 292
Data Received is : Hello Friends 294
Data Received is : Hello Friends 1
Receving Failed : Data send is : Hello Friends 294
Data send is : Hello Friends 296
Data send is : Hello Friends 298
Data send is : Hello Friends 300
Data send is : Hello Friends 302
Data send is : Hello Friends 304
Data send is : Hello Friends 306
Data send is : Hello Friends 308
Data send is : Hello Friends 310
Data send is : Hello Friends 312
Data send is : Hello Friends 314
Data send is : Hello Friends 316
Data send is : Hello Friends 318
Data send is : Hello Friends 320
Data send is : Hello Friends 322
Data send is : Hello Friends 324
Data send is : Hello Friends 326
Data send is : Hello Friends 328
Data send is : Hello Friends 330
Data send is : Hello Friends 332
Data send is : Hello Friends 334
Data send is : Hello Friends 336
Data send is : Hello Friends 338
Data send is : Hello Friends 340
Data send is : Hello Friends 342
Data send is : Hello Friends 344
Data send is : Hello Friends 346
Data send is : Hello Friends 348
Data send is : Hello Friends 350
Data send is : Hello Friends 352
Data send is : Hello Friends 354
Data send is : Hello Friends 356
Data send is : Hello Friends 358
Data send is : Hello Friends 360
Data send is : Hello Friends 362
Data send is : Hello Friends 364
Data send is : Hello Friends 366
Data send is : Hello Friends 368
Data send is : Hello Friends 370
Data send is : Hello Friends 372
Data send is : Hello Friends 374
Data send is : Hello Friends 376
Data send is : Hello Friends 378
Data send is : Hello Friends 380
Data send is : Hello Friends 382
Data send is : Hello Friends 384
Data send is : Hello Friends 386
Data send is : Hello Friends 388
Data send is : Hello Friends 390
Data send is : Hello Friends 392
Data send is : Hello Friends 394
Data send is : Hello Friends 396
Data send is : Hello Friends 398
Data send is : Hello Friends 400
Data send is : Hello Friends 402
Data send is : Hello Friends 404
Data send is : Hello Friends 406
Data send is : Hello Friends 408
Data send is : Hello Friends 410
Data send is : Hello Friends 412
Data send is : Hello Friends 414
Data send is : Hello Friends 416
Data send is : Hello Friends 418
Data send is : Hello Friends 420
Data send is : Hello Friends 422
Data send is : Hello Friends 424
Data send is : Hello Friends 426
Data send is : Hello Friends 428
Data send is : Hello Friends 430
Data send is : Hello Friends 432
Data send is : Hello Friends 434
Data send is : Hello Friends 436
Data send is : Hello Friends 438
Data send is : Hello Friends 440
Data send is : Hello Friends 442
Data send is : Hello Friends 444
Data send is : Hello Friends 446
Data send is : Hello Friends 448
Data send is : Hello Friends 450
Data send is : Hello Friends 452
Data send is : Hello Friends 454
Data send is : Hello Friends 456
Data send is : Hello Friends 458
Data send is : Hello Friends 460
Data send is : Hello Friends 462
Data send is : Hello Friends 464
Data send is : Hello Friends 466
Data send is : Hello Friends 468
Data send is : Hello Friends 470
Data send is : Hello Friends 472
Data send is : Hello Friends 474
Data send is : Hello Friends 476
Data send is : Hello Friends 478
Data send is : Hello Friends 480
Data send is : Hello Friends 482
Data send is : Hello Friends 484
Data send is : Hello Friends 486
Data send is : Hello Friends 488
Data send is : Hello Friends 490
Data send is : Hello Friends 492
Data send is : Hello Friends 494
Data send is : Hello Friends 496
Data send is : Hello Friends 498
Data send is : Hello Friends 500
Data send is : Hello Friends 1
Data send is : Hello Friends 3
Data send is : Hello Friends 5
Data send is : Hello Friends 7
Data send is : Hello Friends 9
Data send is : Hello Friends 11
Data send is : Hello Friends 13
Data send is : Hello Friends 15
Data send is : Hello Friends 17
Data send is : Hello Friends 19
Data send is : Hello Friends 21
Data send is : Hello Friends 23
Data send is : Hello Friends 25
Data send is : Hello Friends 27
Data send is : Hello Friends 29
Data send is : Hello Friends 31
Data send is : Hello Friends 33
Data send is : Hello Friends 35
Data send is : Hello Friends 37
Data send is : Hello Friends 39
Data send is : Hello Friends 41
Data send is : Hello Friends 43
Data send is : Hello Friends 45
Data send is : Hello Friends 47
Data send is : Hello Friends 49
Data send is : Hello Friends 51
Data send is : Hello Friends 53
Data send is : Hello Friends 55
Data send is : Hello Friends 57
Data send is : Hello Friends 59
Data send is : Hello Friends 61
Data send is : Hello Friends 63
Data send is : Hello Friends 65
Data send is : Hello Friends 67
Data send is : Hello Friends 69
Data send is : Hello Friends 71
Data send is : Hello Friends 73
Data send is : Hello Friends 75
Data send is : Hello Friends 77
Data send is : Hello Friends 79
Data send is : Hello Friends 81
Data send is : Hello Friends 83
Data send is : Hello Friends 85
Data send is : Hello Friends 87
Data Received is : Hello Friends 296
Data Received is : Hello Friends 298
Data Received is : Hello Friends 300
Data Received is : Hello Friends 302
Data Received is : Hello Friends 304
Data Received is : Hello Friends 306
Data Received is : Hello Friends 308
Data Received is : Hello Friends 310
Data Received is : Hello Friends 312
Data Received is : Hello Friends 314
Data Received is : Hello Friends 316
Data Received is : Hello Friends 318
Data Received is : Hello Friends 320
Data Received is : Hello Friends 322
Data Received is : Hello Friends 324
Data Received is : Hello Friends 326
Data Received is : Hello Friends 328
Data Received is : Hello Friends 330
Data Received is : Hello Friends 332
Data Received is : Hello Friends 334
Data Received is : Hello Friends 336
Data Received is : Hello Friends 338
Data Received is : Hello Friends 340
Data Received is : Hello Friends 342
Data Received is : Hello Friends 344
Data Received is : Hello Friends 346
Data Received is : Hello Friends 348
Data Received is : Hello Friends 350
Data Received is : Hello Friends 352
Data Received is : Hello Friends 354
Data Received is : Hello Friends 356
Data Received is : Hello Friends 358
Data Received is : Hello Friends 360
Data Received is : Hello Friends 362
Data Received is : Hello Friends 364
Data Received is : Hello Friends 366
Data Received is : Hello Friends 368
Data Received is : Hello Friends 370
Data Received is : Hello Friends 372
Data Received is : Hello Friends 374
Data Received is : Hello Friends 376
Data Received is : Hello Friends 378
Data Received is : Hello Friends 380
Data Received is : Hello Friends 382
Data Received is : Hello Friends 384
Data Received is : Hello Friends 386
Data Received is : Hello Friends 388
Data Received is : Hello Friends 390
Data Received is : Hello Friends 392
Data Received is : Hello Friends 394
Data Received is : Hello Friends 396
Data Received is : Hello Friends 398
Data Received is : Hello Friends 400
Data Received is : Hello Friends 402
Data Received is : Hello Friends 404
Data Received is : Hello Friends 406
Data Received is : Hello Friends 408
Data Received is : Hello Friends 410
Data Received is : Hello Friends 412
Data Received is : Hello Friends 414
Data Received is : Hello Friends 416
Data Received is : Hello Friends 418
Data Received is : Hello Friends 420
Data Received is : Hello Friends 422
Data Received is : Hello Friends 424
Data Received is : Hello Friends 426
Data Received is : Hello Friends 428
Data Received is : Hello Friends 430
Data Received is : Hello Friends 432
Data Received is : Hello Friends 434
Data Received is : Hello Friends 436
Data Received is : Hello Friends 438
Data Received is : Hello Friends 440
Data Received is : Hello Friends 442
Data Received is : Hello Friends 444
Data Received is : Hello Friends 446
Data Received is : Hello Friends 448
Data Received is : Hello Friends 450
Data Received is : Hello Friends 452
Data Received is : Hello Friends 454
Data Received is : Hello Friends 456
Data Received is : Hello Friends 458
Data Received is : Hello Friends 460
Data Received is : Hello Friends 462
Data Received is : Hello Friends 464
Data Received is : Hello Friends 466
Data Received is : Hello Friends 468
Data Received is : Hello Friends 470
Data Received is : Hello Friends 472
Data Received is : Hello Friends 474
Data Received is : Hello Friends 476
Data Received is : Hello Friends 478
Data Received is : Hello Friends 480
Data Received is : Hello Friends 482
Data Received is : Hello Friends 484
Data Received is : Hello Friends 486
Data Received is : Hello Friends 488
Data Received is : Hello Friends 490
Data Received is : Hello Friends 492
Data Received is : Hello Friends 494
Data Received is : Hello Friends 496
Data Received is : Hello Friends 498
Data Received is : Hello Friends 500
Data Received is : Hello Friends 3
Data Received is : Hello Friends 5
Data Received is : Hello Friends 7
Data Received is : Hello Friends 9
Data Received is : Hello Friends 11
Data Received is : Hello Friends 13
Data Received is : Hello Friends 15
Data Received is : Hello Friends 17
Data Received is : Hello Friends 19
Data Received is : Hello Friends 21
Data Received is : Hello Friends 23
Data Received is : Hello Friends 25
Data Received is : Hello Friends 27
Data Received is : Hello Friends 29
Data Received is : Hello Friends 31
Data Received is : Hello Friends 33
Data Received is : Hello Friends 35
Data Received is : Hello Friends 37
Data Received is : Hello Friends 39
Data Received is : Hello Friends 41
Data Received is : Hello Friends 43
Data Received is : Hello Friends 45
Data Received is : Hello Friends 47
Data Received is : Hello Friends 49
Data Received is : Hello Friends 51
Data Received is : Hello Friends 53
Data Received is : Hello Friends 55
Data Received is : Hello Friends 57
Data Received is : Hello Friends 59
Data Received is : Hello Friends 61
Data Received is : Hello Friends 63
Data Received is : Hello Friends 65
Data Received is : Hello Friends 67
Data Received is : Hello Friends 69
Data Received is : Hello Friends 71
Data Received is : Hello Friends 73
Data Received is : Hello Friends 75
Data Received is : Hello Friends 77
Data Received is : Hello Friends 79
Data Received is : Hello Friends 81
Data Received is : Hello Friends 83
Data Received is : Hello Friends 85
Data Received is : Hello Friends 87
Data Received is : Hello Friends 89
Receving Failed : Data send is : Hello Friends 89
Data send is : Hello Friends 91
Data send is : Hello Friends 93
Data send is : Hello Friends 95
Data send is : Hello Friends 97
Data send is : Hello Friends 99
Data send is : Hello Friends 101
Data send is : Hello Friends 103
Data send is : Hello Friends 105
Data send is : Hello Friends 107
Data send is : Hello Friends 109
Data send is : Hello Friends 111
Data send is : Hello Friends 113
Data send is : Hello Friends 115
Data send is : Hello Friends 117
Data send is : Hello Friends 119
Data send is : Hello Friends 121
Data send is : Hello Friends 123
Data send is : Hello Friends 125
Data send is : Hello Friends 127
Data send is : Hello Friends 129
Data send is : Hello Friends 131
Data send is : Hello Friends 133
Data send is : Hello Friends 135
Data send is : Hello Friends 137
Data send is : Hello Friends 139
Data send is : Hello Friends 141
Data send is : Hello Friends 143
Data send is : Hello Friends 145
Data send is : Hello Friends 147
Data send is : Hello Friends 149
Data send is : Hello Friends 151
Data send is : Hello Friends 153
Data send is : Hello Friends 155
Data send is : Hello Friends 157
Data send is : Hello Friends 159
Data send is : Hello Friends 161
Data send is : Hello Friends 163
Data send is : Hello Friends 165
Data send is : Hello Friends 167
Data send is : Hello Friends 169
Data send is : Hello Friends 171
Data send is : Hello Friends 173
Data send is : Hello Friends 175
Data send is : Hello Friends 177
Data send is : Hello Friends 179
Data send is : Hello Friends 181
Data send is : Hello Friends 183
Data send is : Hello Friends 185
Data send is : Hello Friends 187
Data send is : Hello Friends 189
Data send is : Hello Friends 191
Data send is : Hello Friends 193
Data send is : Hello Friends 195
Data send is : Hello Friends 197
Data send is : Hello Friends 199
Data send is : Hello Friends 201
Data send is : Hello Friends 203
Data send is : Hello Friends 205
Data send is : Hello Friends 207
Data send is : Hello Friends 209
Data send is : Hello Friends 211
Data send is : Hello Friends 213
Data send is : Hello Friends 215
Data send is : Hello Friends 217
Data send is : Hello Friends 219
Data send is : Hello Friends 221
Data send is : Hello Friends 223
Data send is : Hello Friends 225
Data send is : Hello Friends 227
Data send is : Hello Friends 229
Data send is : Hello Friends 231
Data send is : Hello Friends 233
Data send is : Hello Friends 235
Data send is : Hello Friends 237
Data send is : Hello Friends 239
Data send is : Hello Friends 241
Data send is : Hello Friends 243
Data send is : Hello Friends 245
Data send is : Hello Friends 247
Data send is : Hello Friends 249
Data send is : Hello Friends 251
Data send is : Hello Friends 253
Data send is : Hello Friends 255
Data send is : Hello Friends 257
Data send is : Hello Friends 259
Data send is : Hello Friends 261
Data send is : Hello Friends 263
Data send is : Hello Friends 265
Data send is : Hello Friends 267
Data send is : Hello Friends 269
Data send is : Hello Friends 271
Data send is : Hello Friends 273
Data send is : Hello Friends 275
Data send is : Hello Friends 277
Data send is : Hello Friends 279
Data send is : Hello Friends 281
Data send is : Hello Friends 283
Data send is : Hello Friends 285
Data send is : Hello Friends 287
Data send is : Hello Friends 289
Data send is : Hello Friends 291
Data send is : Hello Friends 293
Data send is : Hello Friends 295
Data send
Getting stuck at the above line not sure why ? 卡在上面的线不知道为什么?
Your problem has - imho - nothing to do with threading. 你的问题有 - imho - 与线程无关。 When you call msgsnd()
then the message is written into a global queue. 当您调用msgsnd()
该消息将写入全局队列。 The size of the queue is limited to a defined size, to protect the system from overflowing, if no reader is available. 如果没有可用的读取器,则队列的大小限制为定义的大小,以防止系统溢出。
From the man page of msgsnd()
从msgsnd()
的手册页
If insufficient space is available in the queue, then the default behavior of
msgsnd()
is to block until space becomes available. 如果队列中的空间不足,则msgsnd()
的默认行为将阻塞,直到空间可用。
From the man page of msgrcv()
: 从msgrcv()
的手册页:
The
msgrcv()
system call removes a message from the queue specified by msqid and places it in the buffer pointed to by msgp.msgrcv()
系统调用从msqid指定的队列中删除一条消息,并将其放在msgp指向的缓冲区中。
In your case both receive_func
fail and exit, and as of that there no one is reading from that queue anymore, the queue is running full, and as soon as it is full the msgsnd()
will block until the queue has space again. 在你的情况下, receive_func
失败并退出,并且receive_func
没有人正在从该队列中读取,队列正在运行,并且一旦它已满, msgsnd()
将阻塞,直到队列再次有空间。
If you use IPC_NOWAIT
then you need to test if the error you got was ENOMSG
, and don't exit the thread but do eg a sleep: 如果你使用IPC_NOWAIT
那么你需要测试你得到的错误是否是ENOMSG
,并且不要退出线程但是做一个睡眠:
IPC_NOWAIT
Return immediately if no message of the requested type is in the queue. 如果队列中没有所请求类型的消息,则立即返回。 The system call fails witherrno
set toENOMSG
. 系统调用失败,并将errno
设置为ENOMSG
。
In your current code you just exit the file loop if no message is available at the moment: 在当前代码中,如果目前没有消息可用,则退出文件循环:
if (mq.receive_message() == false)
break;
So you need to distinguish between, message read, no message available or an error occurred the needs to end the thread. 因此,您需要区分,消息读取,没有可用消息或者发生了结束线程的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.