读者作家 – 作家线程总是被困在多个读者线程中

读者作家 – 作家线程总是被困在多个读者线程中,第1张

概述读者作家 – 作家线程总是被困在多个读者线程中

新的bIE在这里。 我一直在努力解决读者/作者的问题。 它与1个阅读器和1个作家完美的工作。 但是当我把读者修改为2时, 作家线程总是饿死。 帮我!

看来作家线程卡在某处等待互斥量。

#include <stdio.h> #include <conio.h> #include <windows.h> HANDLE mutex,wrt; int g_ReadCount = 0; int g_globalData=0; const int max = 2; HANDLE reader[max],writer[max]; CRITICAL_SECTION rSect,wSect; bool bTerminate = true; DWORD Readers(LPVOID lpDWThreadParam ) { while(bTerminate) { WaitForSingleObject(mutex,INFINITE); g_ReadCount++; if(g_ReadCount == 1) { WaitForSingleObject(wrt,INFINITE); } ReleaseMutex(mutex); EnterCriticalSection(&wSect); printf("ThreadID : %d --> Read data : %d ReaderCount %dn",GetCurrentThreadID(),g_globalData,g_ReadCount); LeaveCriticalSection(&wSect); WaitForSingleObject(mutex,INFINITE); g_ReadCount--; if(g_ReadCount == 0) { ReleaseMutex(wrt); printf("ThreadID : %d Realesed Mutex wrtn",GetCurrentThreadID()); } printf("ThreadID : %d ReaderCount %dn",g_ReadCount); ReleaseMutex(mutex); printf("Reader ThreadID : %d Realesed Mutex mutexn",g_ReadCount); Sleep(0); } return 0; } DWORD Writers(LPVOID lpDWThreadParam ) { int n = GetCurrentThreadID(); int temp = 1; while(bTerminate) { printf("ThreadID : %d Waiting for WRTn",GetCurrentThreadID()); WaitForSingleObject(wrt,INFINITE); printf("WRITER ThreadID : %d ***Got WRTn",GetCurrentThreadID()); ++n; temp++; if(temp == 100) { //bTerminate = false; } EnterCriticalSection(&wSect); printf("Write by ThreadID : %d Data : %d Temp %dn",n,temp); g_globalData = n; LeaveCriticalSection(&wSect); ReleaseMutex(wrt); } printf("***VVV***Exiting Writer Threadn"); return 0; } voID main() { mutex = CreateMutex(NulL,false,"Writer"); wrt = CreateMutex(NulL,"wrt"); InitializeCriticalSection(&rSect); InitializeCriticalSection(&wSect); DWORD DWThreadID = 0; for(int i=0; i < max; i++) { reader[i] = CreateThread(NulL,//Choose default security 0,//Default stack size (LPTHREAD_START_ROUTINE)&Readers,//Routine to execute (LPVOID) 0,//Thread parameter 0,//Immediately run the thread &DWThreadID //Thread ID ); } for(int i=0; i < 1; i++) { writer[i] = CreateThread(NulL,//Default stack size (LPTHREAD_START_ROUTINE)&Writers,//Immediately run the thread &DWThreadID //Thread ID ); } getchar(); }

使用多于一个的g_ReadCount线程,很有可能g_ReadCount永远不会变为零,所以wrt互斥将永远不会被释放(从而使作者挨饿)。 您可能需要某种指示器,即写入器线程正在等待。 那么读者线程就需要在某个时候优先考虑作者。

例如,在我写的一个实现中(不是说这是一个很好的方法,但是它的工作原理)我使用了一个通过原子递增/递减 *** 作设置/清除的标志,指示写入程序线程是否正在等待锁定。 如果是这样,读者会坚持下去。 当然,在这种情况下,你还需要注意写作者线索(如果不止一个)可能会使读者挨饿的相反情况。 读/写锁是棘手的。

在解决这个问题的同时, 我发现有趣的问题。

在学习期间; 我们告诉max count = 1的信号量等于互斥量。 这不完全正确。

1)互斥锁不能被任何其他线程释放。 2)在这种情况下可以使用信号量。

总结

以上是内存溢出为你收集整理的读者作家 – 作家线程总是被困在多个读者线程中全部内容,希望文章能够帮你解决读者作家 – 作家线程总是被困在多个读者线程中所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1269084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存