hat*_*atz 4 c++ printf multithreading semaphore cout
一些背景:
我有一个使用pthreads多线程的c ++程序.该计划是一个酒店预订系统,有10位客人(每个人都有自己的主题),一个登记台(1个主题)和一个退房服务台(1个主题).酒店只有5间客房可供客人入住.我正在使用信号量在此计划中强制执行互斥和事件订购.
题:
这是我的代码(只是需要的部分......)
sem_init(&openRooms, 0, 5);
sem_wait(&openRooms); //waits for there to be an open room at the hotel
cout << "Guest " << guestNumber << " waits for check-in." << endl;
sem_wait(&checkInLine); //waits for an open spot at the check-in desk
Run Code Online (Sandbox Code Playgroud)
有5位客人可以同时入住酒店,因为这里有5间客房.当我运行程序时,我得到输出(或类似......)
Guest Guest Guest Guest 24 waits for check-in. waits for check-in.1 waits for check-in.
3 waits for check-in.
Run Code Online (Sandbox Code Playgroud)
似乎cout允许同时运行多个打印,这就是"Guest"连续多次打印的原因.
我试过用printf做这个,同样的问题不会发生.在另一个线程可以打印语句之前打印整个语句.
sem_wait(&checkInSt); //Only one person at check in receptionist at a time
printf("Guest %ld goes to the check-in receptionist.\n", my_rank);
currentThreadIn = my_rank; //Rank for receptionist to use in room assignment
Run Code Online (Sandbox Code Playgroud)
输出:
Guest 1 waits for check in.
Guest 3 waits for check in.
Guest 2 waits for check in.
Guest 4 waits for check in.
Guest 0 waits for check in.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?是否有某种cout使用的bugger?另外,有没有办法避免使用cout?我可以使用额外的信号量来确保cout语句在另一个可以打印之前打印,但我正在寻找一种方法而不使用那个额外的信号量
Jon*_*ter 12
printf("Guest %ld goes to the check-in receptionist.\n", my_rank);
Run Code Online (Sandbox Code Playgroud)
使用时printf,您的字符串将格式化为内部缓冲区,然后在单个操作("Guest 2 waits for check-in.")中输出到控制台.
cout << "Guest " << guestNumber << " waits for check-in." << endl;
Run Code Online (Sandbox Code Playgroud)
使用时cout,您的字符串将以多个部分输出到控制台 - "Guest"后跟guestNumber依次为" waits for check-in.",然后是endl.这是因为每次对<<操作符的调用就像是一个单独的函数调用一样(它返回对同一个cout对象的引用,以便下次调用).
因此,虽然写入控制台本身是线程安全的和原子的,cout但对于每个单独的子字符串,它只是原子的.
如果您不想使用的解决方案printf是a)使用信号量或其他锁定机制,或b)在使用之前格式化文本stringstream,然后将其作为单个字符串输出.