
Howard Hinnant wrote:
On Aug 23, 2007, at 10:35 AM, Peter Dimov wrote:
On reflection though, I'll change the constructor from
explicit condition( Mutex * pm = 0 );
to
explicit condition( Mutex * pm );
as it's too easy to accidentally disable checking by not including the condition in the member init list.
Doesn't this remove goal 2?
2. The freedom to dynamically associate mutexes with condition variables.
No, condition( 0 ) still works as before, it's just not a default constructor. The problem is that in: class X { mutex mx_; condition cn_; public: X() {} }; the author of X may have accidentally omitted the initialization of cn_. Without a default constructor, this doesn't compile and one needs to explicitly choose between X(): cn_( &mx_ ) {} and X(): cn_( 0 ) {} // no checking The compromise where a default-constructed (checked) condition is automatically associated with the mutex the first time wait is called doesn't help if one consistently uses wait with the wrong mutex (as could happen if there is a single wait call in the code - not unusual).