This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
RE: pthread_create()'s behavor?
- From: Bryan Evenson <bevenson at melinkcorp dot com>
- To: Hei Chan <structurechart at yahoo dot com>, "libc-help at sourceware dot org"<libc-help at sourceware dot org>
- Date: Mon, 16 Apr 2012 08:36:21 -0400
- Subject: RE: pthread_create()'s behavor?
- References: <1334555816.26507.YahooMailNeo@web36501.mail.mud.yahoo.com>
Hei,
In my experience, when you start dealing with pthreads "indeterminate" is the best description of events. If you have some items that must exist before calling pthread_create or if you are creating multiple threads and they need to be created in a specific order, you need to be doing the checks yourself. Also, there is always the possibility that the call to new failed to allocate memory and your map list may be empty.
I'd suggest validating that your map is not empty with a call to m_myMap.empty() before you try to perform any action on the map.
-Bryan
-----Original Message-----
From: libc-help-owner@sourceware.org [mailto:libc-help-owner@sourceware.org] On Behalf Of Hei Chan
Sent: Monday, April 16, 2012 1:57 AM
To: libc-help@sourceware.org
Subject: pthread_create()'s behavor?
Hi,
I am using pthread library on CentOS 5.5.
I have the following code:
class B {};
class A {
private:
?? std::map<long, B*> m_myMap;
public:
?? A::A() {
?????? m_myMap[0] = new B();
?????? pthread_t threadID;
?????? pthread_create(&threadID, NULL, start, NULL);
?? }
?? static void* start(void*) {
?????? // use m_myMap[0] here, will this new thread sees everything happens before it gets created (e.g. m_myMap[0] contains the valid value)?
?????? m_myMap.find(0);
?? }
}
Sometimes (~1% chance), I got a segfault at m_myMap.find(0).? Is it true that pthread_create() won't try to enforce the memory barrier to ensure all the previous writes to be globally visible?
Thanks in advance.
Cheers,
Hei