Errata

Win32 Multithreaded Programming

Errata for Win32 Multithreaded Programming

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.

Color Key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted by Date submitted
Printed Page 72
last items in the table of the page 72

I think "Signaled" and "Nonsignaled" explanation is mixed. I think correct
explanation should be like the below.

1. "Signaled" section of Pipe

When there is unread data in the pipe. Data can be read from a pipe using the
ReadFile functionon the read handle associated with a given pipe.

2. "Nonsignaled" section of Pipe

When the pipe is empty. Dta can be placed in a pipe using the WriteFile operation on
the write handle associated with a given pipe.

And "Named pipe" explanation in the page 73 should be changed like "Pipe".

Anonymous   
Printed Page 86
8th line

This is near the end of the DuelingThreads1.cpp file. On this line, the
file reads:

if (dwResult != WAIT_OBJECT_0) {

to check to see if WaitForMultipleObjects() returned any errors. From my
understanding, this call should assume that any result between
WAIT_OBJECT_0 and (WAIT_OBJECT_0 + nCount - 1) should be considered
okay. That would mean this code should read:

if (!((dwResult >= WAIT_OBJECT_0) && (dwResult <= WAIT_OBJECT_0 + 3 - 1))) {

Please let me know if I am missing something.

Anonymous   
Printed Page 169

The first two sentences of the 5th paragraph now read:

"Usually it is easist to have a CMclThread-derived object create its
own CMclThreadHandler object inside the derived class constructor.
This will be demonstrated in the Bees1.cpp example..."

Is Bees1.cpp right?

If so, I think these sentences should read:

"Usually it is easist to have a CMclThreadHandler-derived object
create its own CMclThread object inside the derived class constructor.
This will be demonstrated in the Bees1.cpp example..."

If this is not right, should Bees1.cpp be changed to Bees2.cpp?

Anonymous   
Printed Page 201-216
?] I have found a bug in CMclMailbox.cpp

CopyMemory( lpMsg, GetHeadPtr(), m_pHdr->cbMsgSize)
"m_pHdr->cbMsgSize" is the buffer size when I create this object.

But, in run time actual message size will be different. Since it is a shared
memory I was getting part of the messages from other slots of the mailbox.
I changed to:

CopyMemory( GetTailPtr(), lpMsg, strlen((char*)lpMsg))
CopyMemory( lpMsg, GetHeadPtr(), strlen((char *)GetHeadPtr()))

and I get a message from only my slot.

Anonymous   
Printed Page 289
CMclEvent object in SeatDataBase

I think the m_ceNoReaders object should create a manual, signaled event. The default
arguments of the Event class create a non-signaled, auto_event. Therefore the
following statement in the program:

CMclEvent m_ceNoReaders;
should change to:
CMclEvent m_ceNoReaders(TRUE, TRUE);

Anonymous   
Printed Page 341-344
The program listings for cfixedthreadpool.cpp (example 10-3) and

ftptest.cpp (example 10-4) appear to be identical. This doesn't match the
source code on the disc.

Anonymous   
Printed Page 418
3rd paragraph

Text states that CMclWinThread::MclInitInstance calls the original MFC implementation CWinThread::InitInstance. But a look at the M
cl4Mfc.cpp file reveals this:

// these functions call the original MFC base
// class implementations...
BOOL CMclWinThread::MfcInitInstance(void) {
// we MUST return TRUE here or MFC will shutdown
// the newly created thread...
return TRUE;
}

Should not the correct implementation look like this:

BOOL CMclWinThread::MfcInitInstance(void) {
// we MUST return TRUE here or MFC will shutdown
// the newly created thread...
CWinThread::InitInstance();
return TRUE;
}

Anonymous