pthread_mutexattr_setpshared
时间: 2023-10-13 16:18:16 浏览: 48
`pthread_mutexattr_setpshared` 函数是用于设置互斥锁属性中的 `pshared` 属性,该属性决定了互斥锁的共享方式。其函数原型如下:
```c
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
```
其中,`attr` 是指向互斥锁属性对象的指针,`pshared` 是一个整数值,用于设置 `pshared` 属性的值。该函数返回值为 0 表示成功,否则表示失败。
`pshared` 属性有两个可选值:`PTHREAD_PROCESS_PRIVATE` 和 `PTHREAD_PROCESS_SHARED`。当 `pshared` 值为 `PTHREAD_PROCESS_PRIVATE` 时,互斥锁只能在同一进程中共享,不能跨进程共享;当 `pshared` 值为 `PTHREAD_PROCESS_SHARED` 时,互斥锁可以在多个进程之间共享。
需要注意的是,当 `pshared` 值为 `PTHREAD_PROCESS_SHARED` 时,需要使用共享内存来存储互斥锁对象,这需要使用额外的函数来完成,如 `shmget()`、`shmat()` 和 `shmctl()`。
相关问题
pthread_mutexattr
pthread_mutexattr是一个用于设置和获取互斥锁属性的结构体。在使用互斥锁之前,我们可以使用pthread_mutexattr_init函数来初始化这个结构体。然后,可以使用pthread_mutexattr_settype函数来设置互斥锁的类型,例如可以选择设置为PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、PTHREAD_MUTEX_RECURSIVE等类型。最后,使用pthread_mutexattr_destroy函数来销毁互斥锁属性。这些函数可以帮助我们创建和配置互斥锁,以满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [pthread_mutexattr_t设置的相关函数及其说明](https://blog.csdn.net/zz460833359/article/details/120349956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [pthread mutexattr](https://blog.csdn.net/dengwo1109/article/details/102350710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/shm.h> #include <pthread.h> #define SHM_PATH "/mnt/hgfs" struct mt { int num; pthread_mutex_t mutex; pthread_mutexattr_t mutexattr; }; int main () { int iRet=0; unsigned nMemSize=sizeof(struct mt); struct mt *pMt; int iShm_id=0; key_t key =ftok(SHM_PATH, 0); iShm_id=shmget(key,nMemSize,0660|IPC_CREAT); printf("key :iShmID = %d:%d ",key, iShm_id); if(iShm_id<0) { iRet=-1; perror("shmget failed "); return iRet; } pMt = (struct mt*)shmat(iShm_id, NULL, 0); if (-1 == (long)pMt) { perror("shmat addr error "); return -1; } pMt->num=0; pthread_mutexattr_init(&pMt->mutexattr); //???mutex???? pthread_mutexattr_setpshared(&pMt->mutexattr, PTHREAD_PROCESS_SHARED); //?????????? pthread_mutex_init(&pMt->mutex, &pMt->mutexattr); //?????mutex? pid_t child_pid; printf ("the main program process ID is %d ", (int) getpid ()); child_pid = fork (); if (child_pid != 0) { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("-parent----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } else { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("*******************child----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } return 0; }
这是一个用 C 语言写的进程间共享内存程序,使用了共享内存和互斥锁来实现进程间的同步和互斥。
程序中首先定义了一个结构体 mt,其中包含一个整型变量 num 和一个互斥锁 mutex。然后使用共享内存函数 shmget 创建一个共享内存区域,使用 shmat 将共享内存区域映射到当前进程的地址空间中。
在共享内存区域中,可以通过互斥锁来实现进程间的同步和互斥。在程序中,使用 pthread_mutexattr_init、pthread_mutexattr_setpshared 和 pthread_mutex_init 三个函数来初始化互斥锁,并将其设置为进程间共享的互斥锁。然后,在父子进程中都通过 pthread_mutex_lock 和 pthread_mutex_unlock 函数来控制共享内存区域的访问。
在程序中,通过 fork 函数创建了一个子进程。在父子进程中都使用 for 循环对共享内存中的变量 num 进行加 1 操作,每次加 1 后睡眠 1 毫秒。同时,使用互斥锁来保证共享内存区域的访问是互斥的,避免出现数据竞争的情况。
需要注意的是,共享内存是一种高效的进程间通信方式,但也容易出现数据竞争和死锁等问题。在实际场景中,需要注意共享内存的使用方式和注意事项,避免出现意外情况。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)