Re: WaitForSingleObject
Larry wrote:
It basically fires a runtime error when I disconect from the sever!
(closing the telnet window)
Which error exactly?
I wound up finding out that the error may be fired because of this line:
WaitForSingleObject(eventi[threadid], INFINITE);
If I replaceit with: Sleep(1000) everything goes ok....
unsigned int __stdcall Consumer(void* sock)
{
Socket* s = (Socket*) sock;
s->SendBytes("Hello World!" + CRLF);
int threadid = (int)GetCurrentThreadId();
// Create Event & push it in the event map
HANDLE hevent = CreateEvent(NULL,FALSE,FALSE,NULL);
eventi.insert(make_pair(threadid,hevent));
[...]
while(1)
{
// CALLBACK EVENT
WaitForSingleObject(eventi[threadid], INFINITE);
if(users[threadid].cb.at(0).flag == BUFF_DONE)
{
string line = (char*)users[threadid].cb.at(0).data;
int ret = s->SendBytes(line + CRLF);
if(SOCKET_ERROR == ret)
break;
}
}
// Close & remove event from event map
CloseHandle(eventi[threadid]);
eventi.erase(threadid);
[...]
}
If you close the connection, you will break out of the while loop and then
destroy the event and erase it from the map...
unsigned int __stdcall Producer(void*)
{
while(1)
{
Sleep(1000);
char szTime[30]; getDateTime(szTime);
for(uit=users.begin(); uit!=users.end(); ++uit)
{
users[uit->first].cb.push_back(
buffer((unsigned char*)szTime, 30, BUFF_DONE));
SetEvent(eventi[uit->first]);
cout << "Producer is writing to: " << uit->first << endl;
}
}
return 0;
}
.... while the producer is still reading it.
Generally, you didn't protect access to shared data in any way, it can
happen that one thread is reading the map with users while the other is
writing it. This is a no-go for multithreading. Take a look at boost::mutex
or win32's CRITICAL_SECTION.
Uli
--
C++ FAQ: http://parashift.com/c++-faq-lite
Sator Laser GmbH
Gesch??ftsf??hrer: Thorsten F??cking, Amtsgericht Hamburg HR B62 932