3) They can call the same mutex. I believe it is guaranteed that only one will get the lock.
2) Reading a variable doesn't need syncrhonization. If two threads require the same variable to read, then the bus controller will serialize the "require" and give the values to each thread. The problem is with writing.
A classic example
Thr1: r = 2;
Thr2: r = 1;
Both threads read r. It doesn't matter who reads first. It matters who writes last. That will determine r value. If you have:
Thr1: r+= 2;
Thr2: r = 1;
Then the write (for the same variable) makes it necessary for synchronizing the oprerations.
1) So you can read Struct[0].field with Thr1 and Struct[0].field2 with Thr2 and change their value safely. Since the data is in different memory location.
In general, you can safely read Struct[0], since its value cannot be changed, and safely read/write its struct fields since they aren't shared, but each thread reads different memory locations.