简体   繁体   English

IPC Unix消息队列线程安全吗?

[英]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 with errno set to ENOMSG . 系统调用失败,并将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM