When using semaphores or locks, you don't do anything else than acquiring the semaphore (resp. the lock), and then do what you want. For example, if you want to use a lock, then you typically have two threads
# thread 1
# here is all the work for thread 1
and the other thread is completely identical:
# thread 2
The semaphore doesn't issue those. A semaphore is an object that can be used by processes to coordinate between themselves. Thus, a process will call semSignal or semWait on a shared semaphore. We can't describe the conditions under which it will do that in general, because it's up to each process how it wants to use semaphores. Semaphores are a ...
If only one semaphore is used to control the access to the critical section, it is not possible for deadlock to happen. That is why two semaphores are used in the problem statement since the problem is designed to, I assume, showcase deadlock.
A single-semaphore-based program can protect the critical section from concurrent access as well, as demonstrated ...