所以我正在开发一个程序,它允许我使用多个进程打开单个文件实例而不会发生死锁。所以我的程序的关键功能如下。它基本上决定程序是否可以基于邻接图执行文件。所以这一部分似乎都很好。
我遇到的麻烦似乎与我的互斥锁定有关。所以程序执行的基本原理是它决定一个进程需要在其他进程能够打开没有死锁的文件之前完全运行(这是很好的预期行为)。但是,一旦第一个进程完成它就会挂起,我相信我已经将它缩小到代码顶部的pthread_mutex_lock调用。然而,你可以看到我解锁它,所以我很困惑。
这可能与我的互斥锁在共享内存块中使用的事实有关吗?我无法想象它会导致问题,而且我没有别的方法可以做到这一点。我也尝试使用信号量做同样的事情而没有运气。任何帮助将不胜感激。
FILE *openFile(char *path, char *mode) {
int segId = shmget(systemKey, size, S_IRUSR | S_IWUSR | IPC_CREAT);
memStruct* ourMem = (memStruct*)shmat(segId, NULL, 0);
pthread_mutex_lock(&ourMem->openMutex);//~~~~~~~~~~
int hasCycle = containsCycle(ourMem, path);
if(hasCycle == 0) {
FILE* fileToReturn = fopen(path, mode);
int positionOfFile = getFilePosition(path, ourMem);
int positionOfProcess = getProcessPosition(getpid(), ourMem);
ourMem->adjMatrix[positionOfFile][positionOfProcess] = 2;
ourMem->Available[positionOfFile] = 0;
ourMem->fileArray[positionOfFile] = fileToReturn;
pthread_mutex_unlock(&ourMem->openMutex);//~~~~~~~~~~
return fileToReturn;
}
else {
while(1) {
hasCycle = containsCycle(ourMem, path);
if(hasCycle == 0) {
FILE* fileToReturn = fopen(path, mode);
int positionOfFile = getFilePosition(path, ourMem);
int positionOfProcess = getProcessPosition(getpid(), ourMem);
ourMem->adjMatrix[positionOfFile][positionOfProcess] = 2;
ourMem->Available[positionOfFile] = 0;
ourMem->fileArray[positionOfFile] = fileToReturn;
pthread_mutex_unlock(&ourMem->openMutex);//~~~~~~~~~~
return fileToReturn;
}
}
}
pthread_mutex_unlock(&ourMem->openMutex);//~~~~~~~~~~
return NULL;
}