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

标签 c++ linux message-queue

我编写了下面的代码,以了解 Linux 中消息队列的线程安全性。但不确定为什么程序会卡住。虽然在应用适当的锁后它不会卡住。但是如果消息队列是线程安全的那么为什么程序会卡住。或者我在那里错过了一个技巧?一点点帮助或建议都会有很大帮助。


    #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;
    }

下面是短输出端

 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

卡在上面那行不知道为什么?

最佳答案

您的问题 - 恕我直言 - 与线程无关。当您调用 msgsnd() 时,消息将写入全局队列。队列的大小限制在定义的大小内,以防止系统在没有可用读取器时溢出。

来自 msgsnd() 的手册页

If insufficient space is available in the queue, then the default behavior of msgsnd() is to block until space becomes available.

来自 msgrcv() 的手册页:

The msgrcv() system call removes a message from the queue specified by msqid and places it in the buffer pointed to by msgp.

在你的情况下,receive_func 都失败并退出,并且从那时起就没有人再从该队列中读取,队列正在运行满,一旦它满了 msgsnd() 将阻塞,直到队列再次有空间。

如果您使用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.

在您当前的代码中,如果此时没有可用消息,您只需退出文件循环:

 if (mq.receive_message() == false)
     break;

所以你需要区分,消息已读,没有消息可用或发生错误需要结束线程。

关于c++ - IPC Unix消息队列线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443213/

相关文章:

c++ - LLVM - 如何通过 MCJIT 正确使用全局变量

c++ - OpenGL : drawing line using degenerate triangle

java - 托管 HIPPO CMS

linux - 远程 ssh 命令未退出

c++ - 有没有一种直接的方法可以在不通过无关 Material 的情况下获得有关 gcc 可接受的选项值(例如 -std)的明确详细信息?

c++ - CMake 中的 include_directories 和 target_include_directories 有什么区别?

linux - issetugid 的目的?

java - 如何从队列中接收并将其发布到主题中?

message-queue - 如何有选择地从 AMQP(RabbitMQ)队列中删除消息?

c++ - 处理消息太慢,导致 UI 不稳定、无响应 - 如何使用多线程来缓解这种情况?