线程互斥
- 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。
- 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。
- 多个线程并发的操作共享变量,会带来一些问题。
int tickets = 1000;
void *route(void* args) {
std::string name = static_cast<const char*>(args);
while (true) {
if(tickets > 0) {
usleep(10000);
printf("%s 抢占票号:%d\n", name.c_str(), tickets--);
} else {
break;
}
}
return nullptr;
}
int main() {
pthread_t t1, t2, t3, t4;
pthread_create(&t1, nullptr, route, (void*)"thread-1");
pthread_create(&t2, nullptr, route, (void*)"thread-2");
pthread_create(&t3, nullptr, route, (void*)"thread-3");
pthread_create(&t4, nullptr, route, (void*)"thread-4");
pthread_join(t1, nullptr);
pthread_join(t2, nullptr);
pthread_join(t3, nullptr);
pthread_join(t4, nullptr);
return 0;
}
上面这段程序中,tickets 就是所谓的共享资源,而这个共享资源是没有被保护的。我们创建了一批线程,让这几个线程都对这个共享资源进行减一操作,当达到 0 的时候自动退出被回收。
可是,我们观察到两个现象:打印消息出现错乱是为什么?为什么我们的票被抢到了负数呢?








