An app that I've been working on for the past few months uses a single Lua state as a host for multiple worker threads, each with their own callbacks and a (rather simple) event structure. The app is quite thread-safe - Any function that accesses a given Lua state is wrapped in a lock statement, with each state having its own locking object. From there it's all pretty easy to work with. Example below .
While my app is written C# using LuaInterface, you can duplicate this effect in C/C++ quite easily with a mutex or any number of other approaches. Applying Google-Fu to "C++ lock" yields quite a few promising methods (one of which even duplicates the C# lock syntax ). I'd take a look into those and find one that works best for you.
Aside: Locks also do wonders for logging in a multithreaded app.