My architecture (so far - it's in early planning stage): 2 threads (physic and logic thread going 10 Hz and graphic thread going as fast as it can drawing world)
objects are struct-maps with fields position, animation frame, life etc (all fields are functions of time, and can change between physic thread turns, but not in one physic thread turn).
Graphic thread just gets time and for each visible object draws it at current position (calculated from time by objects position function). So movement should be smooth and not dependent on frame rate.
physic thread in response to player input calculates new functions for objects (only for X next turns). These new functions are encapsulated in event objects, that are added to events priority queue.
On each turn (of physic thread) events for that thread are executed - each event takes set of game objects (not always all objects) and time and returns changed set of game ojects.
In C++ this will be much easier to write at first (no hard thinking needed:)), but later it could become nightmare to change because of side effects.