It isn't possible to design a std::list where push_back and pop_front don't both modify the size member. If you have two threads calling these at the same time, they'll probably corrupt the list. You could write a wrapper accessor to make it safe, by using locks. That defeats the goal of a lock-free structure. Both push_back and pop_front of a std::deque will need to modify an internal "vector" of node pointers, and if they're called at the same time by two different threads, again, they corrupt the deque.
One can easily write a list-like or circular-buffer lock-free producer/consumer queue, but no standard C++ container can qualify.
std::queue. The "accessor wrappers" you suggest would necessarily need to ensure that only one thread at a time could call the member functions of the containedstd::queue. You would effectively be implementing a mechanism that requires other threads to wait on the thread currently accessing the shared data structure to complete, i.e., a lock. - Casey