在Linux操作系统中,线程是进程内的执行单元。每个进程都有自己独立的内存空间,但同一个进程内的所有线程共享同一块内存空间。这种共享内存的特性使得线程间通信和数据交换变得非常高效。
malloc
、calloc
、realloc
和free
等函数动态分配和释放。mmap
系统调用可以将文件或设备映射到内存,多个线程可以共享这部分内存。原因:当多个线程同时访问和修改同一资源时,如果没有适当的同步机制,可能会导致不可预测的结果。
解决方法:
#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("Final value of shared_data: %d\n", shared_data);
pthread_mutex_destroy(&mutex);
return 0;
}
原因:两个或多个线程互相等待对方释放资源,导致所有涉及的线程都无法继续执行。
解决方法:
#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 some work
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
return NULL;
}
void* thread2_func(void* arg) {
pthread_mutex_lock(&mutex1); // Change to mutex1 first
pthread_mutex_lock(&mutex2);
// Do some work
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, thread1_func, NULL);
pthread_create(&thread2, NULL, thread2_func, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
通过合理的设计和使用同步机制,可以有效避免和解决线程共享内存带来的问题。
领取专属 10元无门槛券
手把手带您无忧上云