多线程程序的各线程通常会共享某些资源,比如代码、文件、数据等,这些被共享的资源通常会成为临界资源。各线程访问临界资源的代码区段称作临界区,临界区代码的执行应该是互斥的,否则可能造成错误的行为。解决临界区问题的算法必须满足三个条件:
- 互斥:临界区的访问应该是互斥进行的;
- 有空让进:若没有线程的其临界区执行,则应该允许一个或者多个线程请求(进入区)进入其临界区;
- 有限等待:任何线程都不能霸占临界区,即持续访问临界区的时间或者次数应该有一个上限;
下面的这段代码简易地实现了两个线程互斥地访问临界资源(std::string Critical),可以证明,其满足上述三个条件。