So I'm aware that nothing is atomic in C++.  But I'm trying to figure out if there are any "pseudo-atomic" assumptions I can make.  The reason is that I want to avoid using mutexes in some simple situations where I only need very weak guarantees.
1) Suppose I have globally defined volatile bool b, which 
initially I set true.  Then I launch a thread which executes a loop 
while(b) doSomething();
Meanwhile, in another thread, I execute b=true.
Can I assume that the first thread will continue to execute?  In other words, if b starts out as true, and the first thread checks the value of b at the same time as the second thread assigns b=true, can I assume that the first thread will read the value of b as true?    Or is it possible that at some intermediate point of the assignment b=true, the value of b might be read as false?
2) Now suppose that b is initially false.  Then the first thread executes
bool b1=b;
bool b2=b;
if(b1 && !b2) bad();
while the second thread executes b=true.  Can I assume that bad() never gets called?
3) What about an int or other builtin types: suppose I have volatile int i, which is initially (say) 7, and then I assign i=7.  Can I assume that, at any time during this operation, from any thread, the value of i will be equal to 7?
4) I have volatile int i=7, and then I execute i++ from some thread, and all other threads only read the value of i.  Can I assume that i never has any value, in any thread, except for either 7 or 8?  
5) I have volatile int i, from one thread I execute i=7, and from another I execute i=8.  Afterwards, is i guaranteed to be either 7 or 8 (or whatever two values I have chosen to assign)?