Consider the following pseudocode, where S is a semaphore initialized to 5 in line#2 and counter is a shared variable initialized to 0 in line #1. Assume that the increment operation in line#7 is not atomic.
1. int counter = 0;
2. Semaphore S = init(5);
3. void parop(void)
4. {
5. wait(S);
6. wait(S);
7. counter++;
8. signal(S);
9. signal(S);
10. } If five threads execute the function parop concurrently, which of the following program behavior(s) is/are possible?
Step 1: Semaphore behavior analysis.
The semaphore \(S\) is initialized to 5. Each thread performs two \texttt{wait(S)} operations before entering the critical section. Hence, each thread requires 2 units of the semaphore to proceed.
With five threads, the total demand is \(5 \times 2 = 10\) units, but only 5 units are initially available. This immediately creates the possibility of blocking and deadlock.
Step 2: Possibility of deadlock (Option D).
A deadlock can occur if each of the five threads successfully executes the first \texttt{wait(S)} (reducing \(S\) from 5 to 0), and then all block at the second \texttt{wait(S)}. No thread reaches the \texttt{signal(S)} statements, so no semaphore units are released. Thus, a deadlock involving all threads is possible. Hence, (D) is correct.
Step 3: Effect of non-atomic increment.
The statement \texttt{counter++} is not atomic, meaning it consists of read, increment, and write steps. Even though semaphore control limits concurrency, it does not guarantee mutual exclusion for the increment operation. Hence, race conditions are possible.
Step 4: Analysis of Option (A).
In a favorable execution order where threads enter the critical section one at a time and no interleaving occurs during \texttt{counter++}, all five increments may be applied correctly. Thus, the final value of counter can be 5. Hence, (A) is possible.
Step 5: Analysis of Option (B).
Due to race conditions in the non-atomic increment, multiple threads may read the same value of counter and overwrite each other's updates. In an extreme case, all threads read 0 and finally write back 1. Therefore, the final value of counter can be 1. Hence, (B) is also possible.
Step 6: Analysis of Option (C).
If all threads successfully complete execution of \texttt{parop}, each must execute \texttt{counter++} at least once. Therefore, the value of counter cannot remain 0. Hence, (C) is not possible.
Step 7: Final conclusion.
The possible behaviors are (A), (B), and (D).
Consider the following threads, T1, T2, and T3 executing on a single processor, synchronized using three binary semaphore variables, S1, S2, and S3, operated upon using standard wait() and signal(). The threads can be context switched in any order and at any time.

Consider the following multi-threaded code segment (in a mix of C and pseudo-code), invoked by two processes $P1$ and $P2$, and each of the processes spawns two threads $T1$ and $T2$:
int x = 0; // global
Lock L1; // global
main() {
create a thread to execute foo(); // Thread T1
create a thread to execute foo(); // Thread T2
wait for the two threads to finish execution;
print(x); }
foo() {
int y = 0;
Acquire L1;
x = x + 1;
y = y + 1;
Release L1;
print(y); } Which of the following statement(s) is/are correct?