这其实是操作系统上的内容,进程,系统分配资源的最小单位,线程,系统执行指令的最小单位(也可以叫执行任务)
操作系统,充分利用电气特性提升操作任务的性能,同时多进程提升并发执行性能。
现实生活中,生产者–消费者关系。
这是一个很强的一前一后、一前一后……的同步逻辑关系。
说白了,就像流水线。
这其实也是通信的一种,生产者–>缓存区—>消费者
当缓存区为空时,消费者通知生产者快点生产。此时消费者阻塞,生产者在跑。
当缓存区满的时候,生产者通知消费者,缓存区满了,我不能再生产了(生产者),此时生产者阻塞,消费者在跑。
可以通过加锁,实现,生产者生产一块饼干,消费者接着就吃一块饼干。
#include <iostream>
#include <vector>
#include <pthread.h>
const int BUFFER_SIZE = 5;
std::vector<int> buffer;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t _cond = PTHREAD_COND_INITIALIZER;
void* producer(void* arg) {
for (int i = 0; i < 10; ++i) {
pthread_mutex_lock(&mutex); //保护线程同步条件变量锁
while (buffer.size() == BUFFER_SIZE) {
// 缓冲区已满,等待消费者消费数据 生产者不能再生产数据
std::cout << "Producer: Buffer is full. Waiting...\n";
pthread_cond_wait(&_cond, &mutex); //生产者在等 线程同步条件变量被消费者占用
}
buffer.push_back(i);
std::cout << "Producer: Produced data: " << i << "\n";
pthread_cond_signal(&_cond); // 唤醒等待的消费者线程 把线程同步条件变量释放,然后消费者可以占用
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* consumer(void* arg) {
for (int i = 0; i < 10; ++i) {
pthread_mutex_lock(&mutex);
while (buffer.empty()) {
// 缓冲区为空,等待生产者生产数据
std::cout << "Consumer: Buffer is empty. Waiting...\n";
pthread_cond_wait(&_cond, &mutex);
}
int data = buffer.back();
buffer.pop_back();
std::cout << "Consumer: Consumed data: " << data << "\n";
pthread_cond_signal(&_cond); // 唤醒等待的生产者线程
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t producerThread, consumerThread;
pthread_create(&producerThread, NULL, producer, NULL);
pthread_create(&consumerThread, NULL, consumer, NULL);
pthread_join(producerThread, NULL);
pthread_join(consumerThread, NULL);
return 0;
}
pthread_join(producerThread, NULL);表示阻塞当前的main进程,让进程producerThread去跑
后面还有,哲学家吃饭问题、抽烟问题。
其实,后面还可以延伸到死锁问题,死锁预防(银行家算法),其本质就是按照一定规则推算,当下的所有资源能不能满足所有进程的执行,如果可以,这说明不会存在死锁,否者,会发生死锁。应当解决死锁问题。那么就涉及到如何解决死锁问题。