|
Boost Users : |
From: Ben Hutchings (ben.hutchings_at_[hidden])
Date: 2004-12-09 11:33:58
Yuval Ronen wrote:
>>>>A default-constructed thread is documented as being non-joinable:
>>>
>>>Ok, I can't join it. So what can I do with it?
>>
>>Not a whole heck of a lot aside from comparing it to other threads.
>
>
> This brings me some thoughts.
> The thread class is non-copyable (which is fine by me) and also it has an
> operator==. I think these two things contradict each other. When defining an
> equal operator, we are actually defining semantics for copying: copying an
> object will result in a second object that will be equal, in terms of
> operator==, to the first object. Defining an equal operator means that
> objects can be equal, or in other works, they are a copies of the same
> value!
<snip>
As I see it, the problem is that thread combines the functions of thread
ID and thread handle. Joinable and non-joinable thread objects are two
very different types and the type system should reflect that. I think
that thread should be separated into two classes:
class thread_id // Exposition only
{
public:
// construct/copy/destruct
thread_id();
thread_id(const thread_id &);
~thread_id();
// modifier
thread_id & operator=(const thread_id &);
// comparison
bool operator==(const thread_id &) const;
bool operator!=(const thread_id &) const;
};
class thread : private boost::noncopyable // Exposition only
{
public:
// construct/copy/destruct
explicit thread(const boost::function0<void>&);
~thread();
// modifier
void join();
// static
static void sleep(const xtime&);
static void yield();
};
Then every thread object would be joinable and every thread_id would be
copiable.
Ben.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net