In the previous part, we discussed locks and how to use them. In this part, we will take a more complicated example where we will see how this is used in real life. We will wrap the lock functionality in a struct to abstract all the details and ensure that the experience is consistent across our applications. This might not be the case in all applications, but we will guarantee that we have a...