A process/task may be implicitly started.  When a multithreaded program starts the execution of a thread, the rest of the program is not necessarily suspended.  When a thread’s execution is completed, control may not return to the caller.
Two (or more) tasks have to work in a cooperative way:  the second task must wait for the first task to finish execution before it may proceed.  Usually, there are more than one unit of resources to be shared.
explain how a shared buffer contributes to Cooperation Synchronization
 Both must use buffer exciv'ly at any 1 time but in a cop'ative way the read thread A needs the buffer to be "not empty" state before it can read. If buffer empty must wait.  the write thread B writes the buffer if it is not full. else must wait
 the method decrements the value of counter 1  if count val >=0, access to the res granted to the calling process & it on the ready list  if coun val<0 the calling process/thread is added to the semaphore's waiting queue the thread is blocked
 increments the value of semaphore counter by 1.  if the counter value equals or less than zero (meaning there are threads on waiting queue), transfers a blocked thread from the semaphore's waiting queue to the ready list.