勘误_Boost程序库完全开发指南书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Boost程序库完全开发指南 > 勘误
Zilla Boost程序库完全开发指南 的书评 发表时间:2012-06-26 17:06:54

勘误

勘误:

P71
shared_ptr<Y* p>
应为:获得指向类型 Y 的指针 p 的管理权

P430
下画线
应为:下划线

P440

P496
const asio::error_code
应为:const system::error_code

static address (const char* str);
应为:static address from_string (const char* str);

P505
shared_ptr 包装 vector
应为:包装 socket

P507
resolve_connect() 函数调用格式有误
应为:resolve_connect(sock, "www.boost.org", 80);

P481
“拥有条件变量的线程先锁定互斥量,然后循环检查某个条件,如果条件不满足,那么就调用条件变量的成员函数 wait() 等待直至条件满足”
P483
while (!predicate())
        wait(lock);
个人理解:
作者对条件变量的理解似乎并不清晰,有了条件变量后就不需要再 polling 了,因为 wait() 是个阻塞的操作。消费者线程被 wait() 阻塞后,生产者线程把消息放入 message queue 后,会用 notify_one()/notify_all() 通知消费者线程继续执行。
因此,就是:
if (!predicate())
{
        wait(lock);
}
更正(2013.08.18):
是我自己理解有误。
如果只有一个消费者,inotify_one() + if (!predicate()) 更合理;
如果有多个消费者,必须 inotify_all() + while (!predicate())。
原因:
假设 message queue 里新来了一条消息,每个消费者线程都会被通知到有消息到来,但是只有一个消费者(抢到锁的那个)能取到消息。每个消费者线程都再次判断 predicate() 的真假,抢到锁的那个消费者线程得以执行,其它线程只能继续阻塞等待。
如果 inotify_all() + if (!predicate()),会导致每个消费者线程都去取 message queue 的那一条消息,逻辑上就不对,程序执行结果自然也是错的。

展开全文
有用 0 无用 0

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“勘误”的回应

yangtou 2015-06-04 19:15:15

505页 share_ptr包装vector是正确的