13
A
回答
19
相互排斥意味着只有一个线程应该能够在任何给定的时间点访问共享资源。这可以避免线程获取资源之间的竞争条件。监视器和锁提供了这样做的功能。
同步表示您将多个线程的访问同步/排序到共享资源。
考虑下面的例子:
如果你有两个线程,Thread 1
& Thread 2
。
Thread 1
和Thread 2
并行执行,但是在Thread 1
可以按其顺序执行一个语句A
之前,Thread 2
必须按其顺序执行语句B
。你需要的是同步。信号量提供了这一点。您在Thread 1
之前的语句A
之前放置了semapohore,并且您在Thread 2
之后的语句B
之后发布了信号。
这可确保您需要的同步。
0
理解差异的最好方法是借助于一个例子。下面是通过信号量解决经典生产者消费者问题的程序。为了提供互斥,我们通常使用二进制信号量或互斥体,并提供同步使用计数信号量。
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
}
}
在上面的代码互斥变量提供互斥(只允许一个线程访问临界区),而充分和空变量被用于控制同步(以aribtrate共享资源的各种线程之间的访问)。
相关问题
- 1. 同步和互斥
- 2. 线程同步,互斥
- 3. 相互排斥和进程同步; C++
- 4. java方法同步和读/写互斥
- 5. 锁定和同步使用互斥
- 6. 互斥锁与pthread_join之间的区别
- 7. 单声道嵌入:用于同步托管和本地互斥的互斥
- 8. 锁,互斥和临界区之间的区别
- 9. 使用互斥体的Pthread同步
- 10. 使用互斥锁的pthread同步
- 11. Posix线程与互斥锁的同步
- 12. 多个互斥体上的Windows同步
- 13. 线程同步 - 临界区或互斥锁?
- 14. 同步方法用作在Java互斥
- 15. 同步模式互斥保护块
- 16. 线程和进程同步的信号量和互斥量
- 17. 内核编程中互斥和阻塞IO的区别?
- 18. 信号量和互斥量在实现中有什么区别?
- 19. 互斥或不互斥互斥?
- 20. 同步屏幕输出与互斥和pthread
- 21. 互斥使用等待,同步,中断和通知
- 22. GCD临界区/互斥
- 23. 共享互斥和互斥之间的区别(为什么都存在于C++ 11并发中)?
- 24. JMS/MQ和同步方法的区别
- 25. 同步之间的区别
- 26. C#中的互斥 - 来自代码的非同步块的同步
- 27. 互斥C#。如何系统识别互斥码
- 28. 同步(this)和同步(objectReference)之间的区别
- 29. pthread_getspecific和互斥锁
- 30. 互斥锁和锁