Tu dois avant tout identifier les plus petites sections de ton code qui ne doit pas être exécutée par plus d'un thread. On parle de sections critiques, et j'insiste sur le côté petit que ça doit avoir, car sinon tu vas complètement bousiller les perfs de ton programme et perdre tout l'intérêt du multithreading.
Je pense que dans ton cas, il s'agit de la section qui lit le nombre d'articles restants, puis celle qui le met à jour après achat.
Ensuite, tu dois créer une mutex (avec pthread_mutex_init sous les systèmes POSIX, ou CreateMutex sous Windows si je ne dis pas de conneries) au début de ton code de serveur. Elle doit être visible dans les deux sections critiques qu'on a identifiées précédemment.
Au début d'une section critique, tu dois verrouiller l'objet mutex (avec un appel à pthread_mutex_lock dans le monde POSIX, ou je-ne-sais-plus-quelle fonction équivalente chez Windows), puis la déverrouiller à la fin de cette même section. Donc dans ton cas il doit y avoir un verrouillage et un déverrouillage autour de la lecture d'une part, et de l'écriture d'autre part.
Ça résout ton problème de file d'attente, car les appels à pthread_mutex_lock effectués alors que la mutex est déjà verrouillée deviendront bloquants jusqu'au déverrouillage (et l'un des threads en attente pourra alors entrer dans la fameuse section critique).