线程:在Linux中,线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
信号量:信号量是一个同步原语,用于控制多个线程对共享资源的访问。它本质上是一个计数器,用于记录可用资源的数量。当线程想要访问资源时,它必须首先获取信号量;如果信号量的值大于零,则线程可以继续执行并减少信号量的值;如果信号量的值为零,则线程将被阻塞,直到信号量的值变为正数。
队列:队列是一种先进先出(FIFO)的数据结构,用于存储和管理元素。在多线程环境中,队列常用于线程间的安全通信,允许一个线程将数据放入队列,而另一个线程从队列中取出数据。
以下是一个使用Linux线程、信号量和队列的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define QUEUE_SIZE 10
int queue[QUEUE_SIZE];
int front = 0, rear = 0;
sem_t empty, full;
pthread_mutex_t mutex;
void* producer(void* arg) {
for (int i = 0; i < 20; ++i) {
sem_wait(&empty);
pthread_mutex_lock(&mutex);
queue[rear] = i;
rear = (rear + 1) % QUEUE_SIZE;
printf("Produced: %d\n", i);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}
void* consumer(void* arg) {
for (int i = 0; i < 20; ++i) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
int item = queue[front];
front = (front + 1) % QUEUE_SIZE;
printf("Consumed: %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}
int main() {
pthread_t prod_thread, cons_thread;
sem_init(&empty, 0, QUEUE_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_create(&prod_thread, NULL, producer, NULL);
pthread_create(&cons_thread, NULL, consumer, NULL);
pthread_join(prod_thread, NULL);
pthread_join(cons_thread, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
问题1:死锁
问题2:数据竞争
问题3:队列溢出
通过合理设计和使用线程、信号量和队列,可以有效解决多线程编程中的常见问题。
领取专属 10元无门槛券
手把手带您无忧上云