暂时放一例子如下:
class CUploadSongRoad{
HANDLE buffer_full;
HANDLE buffer_empty;
int m_nRoadNum;
CRITICAL_SECTION sc, oc;
int *buffer;
int buffer_p;
int buffer_c;
int p;
int c;
public:
CUploadSongRoad(){}
CUploadSongRoad(int n):m_nRoadNum(n)
{
buffer = new int[m_nRoadNum];
memset(buffer, 0, m_nRoadNum*sizeof(int));
buffer_full = CreateSemaphore(NULL, m_nRoadNum, m_nRoadNum, NULL);
buffer_empty = CreateSemaphore(NULL, 0, m_nRoadNum, NULL);
InitializeCriticalSection(&sc);
InitializeCriticalSection(&oc);
buffer_c = c = 0;
for(int i=0; i<n; i++){
buffer[i] = i;
}
buffer_p = p = n;
}
~CUploadSongRoad()
{
delete []buffer;
DeleteCriticalSection(&sc);
DeleteCriticalSection(&oc);
CloseHandle(buffer_full);
CloseHandle(buffer_empty);
}
unsigned int produce() {
WaitForSingleObject(buffer_empty, INFINITE);
EnterCriticalSection(&sc);
buffer[buffer_p] = p;
printf( "生产者生产了\t%d\n", buffer[buffer_p]);
buffer_p = (++p) % m_nRoadNum;
LeaveCriticalSection(&sc);
ReleaseSemaphore(buffer_full, 1, NULL);
return 0;
}
unsigned int consume() {
WaitForSingleObject(buffer_full, 10*60*1000);
EnterCriticalSection(&sc);
printf("\t消费者消费了\t%d\n", buffer[buffer_c]);
buffer_c = (++c) % m_nRoadNum;
LeaveCriticalSection(&sc);
ReleaseSemaphore(buffer_empty, 1, NULL);
return 0;
}
};
本文介绍了一个基于生产者-消费者模式的C++类实现,该类使用了信号量、互斥锁等同步机制来协调生产者和消费者的操作。通过创建特定数量的缓冲区,并利用WaitForSingleObject和ReleaseSemaphore等函数确保线程安全地读写。
411

被折叠的 条评论
为什么被折叠?



