多线程:多线程是指在一个进程中同时运行多个线程,每个线程执行不同的任务。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
共享内存:共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一块物理内存区域。这种通信方式非常高效,因为数据不需要在进程之间复制。
问题1:竞态条件(Race Condition)
当多个线程同时访问同一资源时,如果没有适当的同步机制,可能会导致不可预测的结果。
解决方法:使用互斥锁(mutex)、信号量(semaphore)等同步原语来保护共享资源。
#include <pthread.h>
#include <stdio.h>
int shared_data = 0;
pthread_mutex_t mutex;
void* thread_func(void* arg) {
pthread_mutex_lock(&mutex);
shared_data++;
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t threads[10];
pthread_mutex_init(&mutex, NULL);
for (int i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for (int i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
printf("Shared data: %d\n", shared_data);
pthread_mutex_destroy(&mutex);
return 0;
}
问题2:死锁(Deadlock)
当两个或多个线程互相等待对方释放资源时,就会发生死锁。
解决方法:确保所有线程以相同的顺序获取锁,或者使用超时机制。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
void* thread1_func(void* arg) {
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
// Do work
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
return NULL;
}
void* thread2_func(void* arg) {
pthread_mutex_lock(&mutex1); // Change order to avoid deadlock
pthread_mutex_lock(&mutex2);
// Do work
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
return NULL;
}
int main() {
pthread_t threads[2];
pthread_create(&threads[0], NULL, thread1_func, NULL);
pthread_create(&threads[1], NULL, thread2_func, NULL);
for (int i = 0; i < 2; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
Linux多线程和共享内存是提高程序性能和实现进程间高效通信的重要技术。通过合理使用同步机制和避免常见的并发问题,可以充分发挥这些技术的优势。
领取专属 10元无门槛券
手把手带您无忧上云