This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/13684] New: local static object variable constructed once but ctors and dtors called multiple times on same memory when called in multiple threads
- From: "evijaykumar at yahoo dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 14 Jan 2004 17:25:16 -0000
- Subject: [Bug c++/13684] New: local static object variable constructed once but ctors and dtors called multiple times on same memory when called in multiple threads
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
I have a simple sample code which illustrates the issue. Basically, if multiple
threads invoke a function which has local static object, the ctor and dtor are
called multiple times on the same object in non reentrant manner until object
is fully constructed. Here is a sample program which illustrates the issue
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
volatile int i;
class A {
public:
int i;
A(int i)
{
this->i = i;
sleep(1);
printf("I am in A ctor %d this:%p\n", i, this);
}
~A() {
printf("A dtor %d this:%p\n", i, this);
}
};
extern "C" void *foo(void *)
{
printf("before static ctor in foo\n");
static A a(i++);
printf("in foo %p a(i) %d\n", &a, a.i);
return NULL;
}
main()
{
printf("I am in main\n");
pthread_t tid;
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
pthread_create(&tid,NULL, foo, NULL);
sleep(3);
foo(NULL);
}
The output of this program is
I am in main
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
before static ctor in foo
I am in A ctor 1 this:210b0
I am in A ctor 3 this:210b0
in foo 210b0 a(i) 10
in foo 210b0 a(i) 10
I am in A ctor 4 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 6 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 8 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 9 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 2 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 5 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 0 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 10 this:210b0
in foo 210b0 a(i) 10
I am in A ctor 7 this:210b0
in foo 210b0 a(i) 10
before static ctor in foo
in foo 210b0 a(i) 10
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
A dtor 10 this:210b0
--
Summary: local static object variable constructed once but ctors
and dtors called multiple times on same memory when
called in multiple threads
Product: gcc
Version: 3.3.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: evijaykumar at yahoo dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13684