互斥意味着在任何给定时刻只有一个线程应该能够访问共享资源。这可以避免线程之间获取资源的竞态条件。监视器和锁提供了此功能。
同步意味着您同步/排序多个线程对共享资源的访问。
考虑以下示例:
如果您有两个线程,线程1
和线程2
。
线程1
和线程2
并行执行,但在线程1
可以执行序列中的某个语句A
之前,必须确保线程2
在其序列中执行了语句B
。在这里需要同步。信号量就提供这个功能。在线程1
的语句A
之前放置一个信号量等待,在线程2
的语句B
之后发布该信号量。
这确保了您需要的同步。
BufferSize = 3;
semaphore mutex = 1; // used for mutual exclusion
semaphore empty = BufferSize; // used for synchronization
semaphore full = 0; // used for synchronization
Producer()
{
int widget;
while (TRUE) { // loop forever
make_new(widget); // create a new widget to put in the buffer
down(&empty); // decrement the empty semaphore
down(&mutex); // enter critical section
put_item(widget); // put widget in buffer
up(&mutex); // leave critical section
up(&full); // increment the full semaphore
}
}
Consumer()
{
int widget;
while (TRUE) { // loop forever
down(&full); // decrement the full semaphore
down(&mutex); // enter critical section
remove_item(widget); // take a widget from the buffer
up(&mutex); // leave critical section
consume_item(widget); // consume the item
}
}