线程同步是指在多线程编程中,控制多个线程按照一定的顺序执行,以避免数据竞争和不一致的问题。线程同步机制确保共享资源在同一时间只能被一个线程访问。
信号量(Semaphore)是一种用于控制多个线程对共享资源访问的同步原语。它是一个计数器,用于管理对共享资源的访问。信号量有两种基本操作:
以下是一个使用信号量解决生产者-消费者问题的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
void* producer(void* arg) {
int item, i;
for (i = 0; i < 20; i++) {
item = i;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Produced: %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}
void* consumer(void* arg) {
int item, i;
for (i = 0; i < 20; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumed: %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
问题1:死锁
问题2:饥饿
问题3:竞态条件
通过合理设计和使用信号量,可以有效解决多线程编程中的同步问题,提高程序的稳定性和性能。
领取专属 10元无门槛券
手把手带您无忧上云