"Jeremiah Gowdy" <[EMAIL PROTECTED]> wrote on 10/11/2005 03:08:40 AM:
> The Windows DLL is thread safe. You do not have to call my_init() > and my_thread_init() because Windows DLLs receive events when they > are attached to a new process and when they are attached to a new > thread in a process. This is one of the nicer features of Windows > shared libraries. Other than that, you don't have to do anything > special. I am a heavy user of libmysql under Win32. You simply > mysql_init() your MYSQL struct, and then mysql_real_connect() and > you're ready to mysql_query(). > > You should not call my_init() or my_thread_init() as the previous > poster suggested. This could result in memory leaks. > > > From libmysql/dll.c > > BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called, > LPVOID lpReserved) > { > switch (ul_reason_being_called) { > case DLL_PROCESS_ATTACH: /* case of libentry call in win 3.x */ > if (!inited++) > { > s_hModule=hInst; > libmysql_init(); > main_thread=GetCurrentThreadId(); > } > break; > case DLL_THREAD_ATTACH: > threads++; > my_thread_init(); > break; > case DLL_PROCESS_DETACH: /* case of wep call in win 3.x */ > if (!--inited) /* Safety */ > { > /* my_thread_init() */ /* This may give extra safety */ > my_end(0); > } > break; > case DLL_THREAD_DETACH: > /* Main thread will free by my_end() */ > threads--; > if (main_thread != GetCurrentThreadId()) > my_thread_end(); > break; > default: > break; > } /* switch */ > return TRUE; > UNREFERENCED_PARAMETER(lpReserved); > } /* LibMain */ > > ----- Original Message ----- > From: "John McCaskey" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>; <mysql@lists.mysql.com> > Sent: Friday, October 07, 2005 10:31 AM > Subject: RE: How thread-safe is mysql_real_connect()? > > > Sean, > > First let me thank you for all the great posts and info I've seen you > put on this list for others. > > I've been working in C with MySQL in a very multithreaded environment > for several years and think I can explain the thread safety issues > clearly. Rather than try to respond point by point to your question I'm > going to give a summary and if that doesn't help please respond again > and I'll answer specific questions. > > First, mysql is in fact pretty much threadsafe when using the _r > library. You definitely do need to use the _r library and not the > normal one as the SIGPIPE discussion applies to both, the non _r library > has additional safety issues surrounding mysql_real_connect() and should > not be used. On windows you don't really need to do anything here I > believe because "the Windows binaries are by default compiled to be > thread-safe." (from > http://dev.mysql.com/doc/mysql/en/threaded-clients.html). To validate > this in your client code you should in the main() function close to > startup use mysql_thread_safe() to verify your linked in version is > thread safe. > > The next thing you need to do is initialize mysql globally before > creating any threads that will use it. Simply call my_init(); in your > main thread. After this you can go ahead and create any threads. In > the threads you create you need to call mysql_thread_init(); and when > you end the thread mysql_thread_end(); in between these calls you can > just use mysql as normal and the mysql_real_connect function will be > thread safe, you do not need to perform any locking of your own to make > only one call at a time or anything along those lines. > > Here is some pseudo code of what you need to do: > > int main(int argc, char **argv) { > > if(!mysql_thread_safe()) { > fprintf(stderr, "Not Thread safe!!!"); > return 1; > } > > my_init(); > > // your regular init code > > // create the threads that will use mysql > CreateThread(....); > > > } > > void *mysql_thread(void *arg) { > mysql_thread_init(); > > > //regular mysql code and whatever else here > //use mysql_real_connect and mysql_real_query > //and whatever without worrying about thread safety > > > > mysql_thread_end(); > } > > > > > John A. McCaskey > Software Development Engineer > Klir Technologies, Inc. > [EMAIL PROTECTED] > 206.902.2027 > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: Friday, October 07, 2005 9:01 AM > To: [EMAIL PROTECTED]; mysql@lists.mysql.com > Subject: How thread-safe is mysql_real_connect()? > <snip> > > Shawn Green > Database Administrator > Unimin Corporation - Spruce Pine > Thank you very much!! Shawn Green Database Administrator Unimin Corporation - Spruce Pine