- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一些背景:
我有一个使用 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
酒店有 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.
看来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
输出:
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.
为什么会这样? cout 使用了某种错误吗?另外,有什么办法可以避免使用 cout 吗?我可以使用一个额外的信号量来确保 cout 语句在另一个可以打印之前打印,但我正在寻找一种不使用该额外信号量的方法
最佳答案
printf("Guest %ld goes to the check-in receptionist.\n", my_rank);
当您使用 printf
时,您的字符串被格式化为内部缓冲区,然后在单个操作中输出到控制台("Guest 2 waits for check-in."
)。
cout << "Guest " << guestNumber << " waits for check-in." << endl;
当您使用 cout
时,您的字符串会分多个部分输出到控制台 - "Guest"
, 其次是 guestNumber
, 其次是 " waits for check-in."
, 其次是 endl
.这是因为每次调用 <<
运算符的发生就好像它是一个单独的函数调用(它返回对同一 cout
对象的引用以供下一次调用使用)。
因此,尽管写入控制台本身是线程安全的和原子的,但在 cout
中情况下它只是每个单独的子字符串的原子。
不想用的解决方法printf
将是 a) 使用信号量或其他锁定机制,或 b) 在使用 stringstream
打印文本之前格式化文本, 然后将其输出为单个字符串。
关于c++ - 在 C++ 中多线程时与 cout 和 printf 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961023/
我想知道 cout<
这可能是一个初学者问题,了解 cout 的工作原理可能是这里的关键。如果有人可以链接到一个好的解释,那就太好了。 cout(&cout) 的地址. cout << &cout打印出 cout 的地址.
经过一整天的编码,我不小心写了 cout << "some text" << cout; 代替 cout << "some text" << endl; 现在它打印出一个内存地址。它指向什么? 最佳答
这与 difference-between-cout-x-and-cout-operator-x 有关问题,但还是有点不同... #include int main(){ std::cout
我是 C++ 的新手,最近我花了几天时间阅读有关指针的内容。我意识到下面的 2 段代码给我不同的结果,尽管它们看起来相同。 第一段代码: int a = 5; int* ptr = &a; cout
我尝试使用更短的语法并避免在任何地方使用 std::,所以我开始使用新的别名语法。在一些例子中,我看到人们这样使用它: using json = nlohmann::json; 并尝试使用 std::
这是我的头文件 #ifndef KINGDOM_H_ #define KINGDOM_H_ #include using namespace std; namespace sict{ cla
我经常遇到要将二维数组打印到屏幕或文件的情况。我的标准方法是这样的: for(int q=0; q #include void printNumber(int x) { std::cout
有一些 cout 语句,但第一个 cout 语句末尾的空格出现在第二个 cout 语句的开头。这是代码: #include int main() { using namespace std;
我在搞乱代码时遇到了这种相当模糊的行为,这是示例: #include using namespace std; int print(void); int main(void) { cout
我收到所有 cout 和 endl 的这些错误消息: main.cc:17:5: error: ‘cout’ was not declared in this scope main.cc:17:5:
这个问题在这里已经有了答案: What is the meaning of prepended double colon "::"? (9 个回答) 关闭 7 个月前。 有一个简单的代码,包含::操
我有下面的代码,我不太明白为什么结果恰好像下面这样: #include #include using namespace std; int main () { std::stringstre
在 C++ 中,当我在 .h 文件中声明自己的命名空间时,如下所示: namespace my_own { //... } 那么,如果我在命名空间 my_own 内部或外部声明 using s
背景 IIRC,来自 Release 2.0 C++ 将单字符常量存储为类型 char而不是 int .但是在 Release 2.0 之前声明如下 cout #include using name
Problem was in IDE I am using - CLion 1.2.4 gives incorrect output inside its own output window, sol
我知道有几个这样的拷贝,但到目前为止,没有一个对我有用。我正在尝试使用 g++ 在 Ubuntu 上编译一个非常简单的 C++ 程序,但它给了我范围错误。 #include using namesp
我在这里有一个难题,我无法解决,也没有在网上找到正确的答案: 我创建了一个带有清理路由的分离线程,问题是在我的 Imac 和 Ubuntu 9.1(双核)上。我无法正确取消空闲代码中的分离线程: #i
#include #include #include using namespace std; int main() { ofstream fout("test.txt"); f
我是一名优秀的程序员,十分优秀!