如何在c++;? 我需要用原始同步对象——事件来解决C++中的生产者-消费者问题,我已经写了这个代码 static int g_x = 0; HANDLE hEvent1; HANDLE aThread[2]; DWORD ThreadID; //tread 1 void Producer() { for (int i = 0; i < 100; ++i) { WaitForSingleObject(hEvent1, INFINITE); g_x = i; SetEvent(hEvent1); } } //thread 2 void Consumer() { for (;;) { WaitForSingleObject(hEvent1, INFINITE); SetEvent(hEvent1); } } int createthreads() { hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL); // Create worker threads aThread[0] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, &ThreadID); aThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, &ThreadID); } int main() { createthreads(); } static int g_x=0; 处理hEvent1; 句柄aThread[2]; 德沃德·特莱德; //踏面1 无效生产者() { 对于(int i=0;iConsumer(); 退出线程(0); } 无效消费者() { 对于(;;) { WaitForSingleObject(hLowEvent,无限); DbgPrint(“%u\n”,_x); 如果(退出) { 返回; } SetEvent(hHighEvent); } } }; void testPC() { 共享数据sd; 如果(!sd.Create()) { 句柄hThreads[2]={}; if(hThreads[0]=CreateThread(0,0,SharedData::_Producer,&sd,0,0)) { if(hThreads[1]=CreateThread(0,0,SharedData::u Consumer,&sd,0,0)) { WaitForMultipleObjects(2,hThreads,TRUE,无限); CloseHandle(hThreads[1]); } 其他的 { sd.\u quit=true; SetEvent(sd.hHighEvent); WaitForSingleObject(hThreads[0],无限); } } CloseHandle(hThreads[0]); } } 对于此类代码,需要使用2个事件。我认为,对生产者线程和消费者线程使用1个事件将导致本博客描述的痛苦createthreads必须返回一个值-并且必须是u stdcall,带有一个参数)两个线程都从WaitForSingleObject开始-在这种情况下都挂起。需要先设置一个事件吗call@RbMm是的,你需要的就是这个@Fsdfdsg你很好!使用信号量而不是事件将支持多个生产者和多个消费者
此代码无法正常工作:我有无限循环如何在c++;? 我需要用原始同步对象——事件来解决C++中的生产者-消费者问题,我已经写了这个代码 static int g_x = 0; HANDLE hEvent1; HANDLE aThread[2]; DWORD ThreadID; //tread 1 void Producer() { for (int i = 0; i < 100; ++i) { WaitForSingleObject(hEvent1, INFINITE); g_x = i; SetEvent(hEvent1); } } //thread 2 void Consumer() { for (;;) { WaitForSingleObject(hEvent1, INFINITE); SetEvent(hEvent1); } } int createthreads() { hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL); // Create worker threads aThread[0] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, &ThreadID); aThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, &ThreadID); } int main() { createthreads(); } static int g_x=0; 处理hEvent1; 句柄aThread[2]; 德沃德·特莱德; //踏面1 无效生产者() { 对于(int i=0;iConsumer(); 退出线程(0); } 无效消费者() { 对于(;;) { WaitForSingleObject(hLowEvent,无限); DbgPrint(“%u\n”,_x); 如果(退出) { 返回; } SetEvent(hHighEvent); } } }; void testPC() { 共享数据sd; 如果(!sd.Create()) { 句柄hThreads[2]={}; if(hThreads[0]=CreateThread(0,0,SharedData::_Producer,&sd,0,0)) { if(hThreads[1]=CreateThread(0,0,SharedData::u Consumer,&sd,0,0)) { WaitForMultipleObjects(2,hThreads,TRUE,无限); CloseHandle(hThreads[1]); } 其他的 { sd.\u quit=true; SetEvent(sd.hHighEvent); WaitForSingleObject(hThreads[0],无限); } } CloseHandle(hThreads[0]); } } 对于此类代码,需要使用2个事件。我认为,对生产者线程和消费者线程使用1个事件将导致本博客描述的痛苦createthreads必须返回一个值-并且必须是u stdcall,带有一个参数)两个线程都从WaitForSingleObject开始-在这种情况下都挂起。需要先设置一个事件吗call@RbMm是的,你需要的就是这个@Fsdfdsg你很好!使用信号量而不是事件将支持多个生产者和多个消费者,c++,winapi,synchronization,C++,Winapi,Synchronization,此代码无法正常工作:我有无限循环 如何修复此代码以将控制台编号从0转到99 您需要另一个事件来同步这两个线程。 我还将两个事件的初始状态设置为FALSE,并在main 通过这种方式,您可以控制流程的启动时间和方式 和Offtopic,createthreads必须返回一个值 static int g_x = 0; HANDLE hEvent1; HANDLE hEvent2; HANDLE aThread[2]; DWORD ThreadID; //tread 1 void Producer
如何修复此代码以将控制台编号从
0
转到99
您需要另一个事件来同步这两个线程。
我还将两个事件的初始状态设置为FALSE
,并在main
通过这种方式,您可以控制流程的启动时间和方式 和Offtopic,
createthreads
必须返回一个值
static int g_x = 0;
HANDLE hEvent1;
HANDLE hEvent2;
HANDLE aThread[2];
DWORD ThreadID;
//tread 1
void Producer()
{
for (int i = 0; i < 100; ++i)
{
WaitForSingleObject(hEvent1, INFINITE);
g_x = i;
SetEvent(hEvent2);
}
}
//thread 2
void Consumer()
{
for (;;)
{
WaitForSingleObject(hEvent2, INFINITE);
SetEvent(hEvent1);
}
}
int createthreads() {
hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
// Create worker threads
aThread[0] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, &ThreadID);
aThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, &ThreadID);
return 0;
}
int main() {
createthreads();
SetEvent(hEvent1);
}
static int g_x=0;
处理hEvent1;
把手2;
句柄aThread[2];
德沃德·特莱德;
//踏面1
无效生产者()
{
对于(int i=0;i<100;++i)
{
WaitForSingleObject(hEvent1,无限);
g_x=i;
SetEvent(hEvent2);
}
}
//线程2
无效消费者()
{
对于(;;)
{
WaitForSingleObject(hEvent2,无限);
SetEvent(hEvent1);
}
}
int createthreads(){
hEvent1=CreateEvent(NULL,FALSE,FALSE,NULL);
hEvent2=CreateEvent(NULL,FALSE,FALSE,NULL);
//创建工作线程
aThread[0]=CreateThread(NULL,0,(LPTHREAD\u START\u例程)Producer,NULL,0,&ThreadID);
aThread[1]=CreateThread(NULL,0,(LPTHREAD\u START\u例程)Consumer,NULL,0,&ThreadID);
返回0;
}
int main(){
createthreads();
SetEvent(hEvent1);
}
实现此任务的方法有很多种,一种可能是-需要使用事件对-2个事件
struct EventPair
{
HANDLE hLowEvent, hHighEvent;
~EventPair()
{
if (hHighEvent) CloseHandle(hHighEvent);
if (hLowEvent) CloseHandle(hLowEvent);
}
EventPair()
{
hLowEvent = 0, hHighEvent = 0;
}
DWORD Create()
{
return (hLowEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) &&
(hHighEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) ? NOERROR : GetLastError();
}
};
struct SharedData : EventPair
{
int _x;
bool _quit;
SharedData()
{
_x = 0;
_quit = false;
}
static DWORD WINAPI _Producer(void* This)
{
reinterpret_cast<SharedData*>(This)->Producer();
ExitThread(0);
}
void Producer()
{
for (int i = 0; ; )
{
_x = i++;
if (i == 100)
{
_quit = true;
}
SetEvent(hLowEvent);
if (_quit)
{
return;
}
WaitForSingleObject(hHighEvent, INFINITE);
}
}
static DWORD WINAPI _Consumer(void* This)
{
reinterpret_cast<SharedData*>(This)->Consumer();
ExitThread(0);
}
void Consumer()
{
for(;;)
{
WaitForSingleObject(hLowEvent, INFINITE);
DbgPrint("%u\n", _x);
if (_quit)
{
return;
}
SetEvent(hHighEvent);
}
}
};
void testPC()
{
SharedData sd;
if (!sd.Create())
{
HANDLE hThreads[2] = {};
if (hThreads[0] = CreateThread(0, 0, SharedData::_Producer, &sd, 0, 0))
{
if (hThreads[1] = CreateThread(0, 0, SharedData::_Consumer, &sd, 0, 0))
{
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
CloseHandle(hThreads[1]);
}
else
{
sd._quit = true;
SetEvent(sd.hHighEvent);
WaitForSingleObject(hThreads[0], INFINITE);
}
}
CloseHandle(hThreads[0]);
}
}
struct事件对
{
处理hLowEvent、hHighEvent;
~EventPair()
{
如果(hHighEvent)关闭手柄(hHighEvent);
如果(HLOWVENT)关闭手柄(HLOWVENT);
}
EventPair()
{
hLowEvent=0,hHighEvent=0;
}
DWORD Create()
{
返回(hLowEvent=CreateEvent(NULL,FALSE,FALSE,NULL))&&
(hHighEvent=CreateEvent(NULL,FALSE,FALSE,NULL))?无错误:GetLastError();
}
};
结构SharedData:EventPair
{
int_x;
布尔!;
SharedData()
{
_x=0;
_退出=错误;
}
静态DWORD WINAPI_生产者(无效*此)
{
重新解释(这个)->Producer();
退出线程(0);
}
无效生产者()
{
对于(int i=0;;)
{
_x=i++;
如果(i==100)
{
_退出=真;
}
SetEvent(hLowEvent);
如果(退出)
{
返回;
}
WaitForSingleObject(hHighEvent,无限);
}
}
静态DWORD WINAPI_使用者(无效*此)
{
重新解释(此)->Consumer();
退出线程(0);
}
无效消费者()
{
对于(;;)
{
WaitForSingleObject(hLowEvent,无限);
DbgPrint(“%u\n”,_x);
如果(退出)
{
返回;
}
SetEvent(hHighEvent);
}
}
};
void testPC()
{
共享数据sd;
如果(!sd.Create())
{
句柄hThreads[2]={};
if(hThreads[0]=CreateThread(0,0,SharedData::_Producer,&sd,0,0))
{
if(hThreads[1]=CreateThread(0,0,SharedData::u Consumer,&sd,0,0))
{
WaitForMultipleObjects(2,hThreads,TRUE,无限);
CloseHandle(hThreads[1]);
}
其他的
{
sd.\u quit=true;
SetEvent(sd.hHighEvent);
WaitForSingleObject(hThreads[0],无限);
}
}
CloseHandle(hThreads[0]);
}
}
对于此类代码,需要使用2个事件。我认为,对生产者线程和消费者线程使用1个事件将导致本博客描述的痛苦createthreads必须返回一个值
-并且必须是u stdcall,带有一个参数)两个线程都从WaitForSingleObject开始-在这种情况下都挂起。需要先设置一个事件吗call@RbMm是的,你需要的就是这个@Fsdfdsg你很好!使用信号量而不是事件将支持多个生产者和多个消费者