#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>
#define SHARED_MEM_NAME "/my_shared_mem"
#define SHARED_MEM_SIZE sizeof(pthread_mutex_t)
int main() {
int fd;
pthread_mutex_t *mutex;
pthread_mutexattr_t attr;
// 创建共享内存对象
fd = shm_open(SHARED_MEM_NAME, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
// 调整共享内存大小
if (ftruncate(fd, SHARED_MEM_SIZE) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
// 映射共享内存到地址空间
mutex = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (mutex == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// 初始化互斥锁属性
if (pthread_mutexattr_init(&attr) != 0) {
perror("pthread_mutexattr_init");
exit(EXIT_FAILURE);
}
if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) {
perror("pthread_mutexattr_setpshared");
exit(EXIT_FAILURE);
}
// 初始化互斥锁
if (pthread_mutex_init(mutex, &attr) != 0) {
perror("pthread_mutex_init");
exit(EXIT_FAILURE);
}
// 清理互斥锁属性
pthread_mutexattr_destroy(&attr);
printf("Mutex initialized\n");
// 等待一段时间以保持进程运行,让另一个进程可以连接到共享内存
sleep(30);
// 销毁互斥锁
if (pthread_mutex_destroy(mutex) != 0) {
perror("pthread_mutex_destroy");
exit(EXIT_FAILURE);
}
// 取消映射
if (munmap(mutex, SHARED_MEM_SIZE) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
// 删除共享内存对象
if (shm_unlink(SHARED_MEM_NAME) == -1) {
perror("shm_unlink");
exit(EXIT_FAILURE);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>
#define SHARED_MEM_NAME "/my_shared_mem"
#define SHARED_MEM_SIZE sizeof(pthread_mutex_t)
int main() {
int fd;
pthread_mutex_t *mutex;
// 打开共享内存对象
fd = shm_open(SHARED_MEM_NAME, O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
// 映射共享内存到地址空间
mutex = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (mutex == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// 使用互斥锁
if (pthread_mutex_lock(mutex) != 0) {
perror("pthread_mutex_lock");
exit(EXIT_FAILURE);
}
printf("Mutex locked\n");
// 模拟一些工作
sleep(5);
if (pthread_mutex_unlock(mutex) != 0) {
perror("pthread_mutex_unlock");
exit(EXIT_FAILURE);
}
printf("Mutex unlocked\n");
// 取消映射
if (munmap(mutex, SHARED_MEM_SIZE) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
总结
pthread_mutexattr_t
属性对象仅用于初始化互斥锁,其生命周期在pthread_mutex_init
完成后就结束了。- 可以在初始化互斥锁之后立即销毁属性对象,而不影响互斥锁的使用。
- 共享内存用于存储互斥锁实例,以便在多个进程之间共享该互斥锁。
一旦互斥锁 pthread_mutex_t
被初始化完毕,就可以立即销毁用于初始化的互斥锁属性 pthread_mutexattr_t
。这些属性仅在初始化过程中使用,初始化完成后,它们不会再被使用。因此,可以安全地销毁它们。
详细解释
pthread_mutexattr_t
属性对象是用来配置互斥锁的一些属性(例如是否可以在进程间共享)。- 这些属性仅在调用
pthread_mutex_init
时使用,之后它们不再需要保留。 - 互斥锁一旦被初始化,其属性已经应用,并且属性对象就可以销毁。