登录
  • #刷题

一道‌‌‍‍‌‍‍‌‌‍‌‌‌‌‍‍‌‌‍‍‍‌‍‌‌‍‍‌‌‌‌‍描述很简洁并且涉及C++高级语言特性的题目

magicsets
1640
6
题目的描述很简单,就是实现一个机制使得可以很容易地在多线程情况下serialize输出流(例如cout / cerr)—— 估计大多数debug过多线程程序的人都遇到过这样的需求,而且这个问题目前Stack Overflow上并没有比较好的答案。

举个例子,如果让两个线程同时循环执行下面这句输出语句:

--

std::cout << "This is thread " << id << std::endl;

--

那么默认的cout的原子性只作用到单个<<符号,也就是说输出并不一定是

--

This is thread 1

This is thread 2

...

--

这样一句一句的打出来,而可能会变成

--

This is thread This is thread 1

2

...

--

这样。也就是说一个线程的一整句话还没打完,另一个线程的输出就插进来了。

那么,为了比较优雅地处理这种多线程情况下完整输出一句话的需求,我们希望设计一个类似Java下面synchronized关键字的机制,使得每个线程只要用下列语句:

--

synchronized(std::cout) << "This is thread " << id << "\n";

--

就能保证输出时单个statement的完整性。

题目就是问这个synchronized该如何实现?

PS:这个问题其实挺适合当C++面试题的,因为它涉及到某个只有C++有而C无法模拟的特性,以及对对象生存期的理解。
6条回复
热度排序

发表回复