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()? (please excuse the double post but I wanted to reach the two audiences I thought could help the best) This is a question about the interpreting the documentation in the manual for the C API. I searched the list archives (all lists) going back 365 days for the terms (unquoted): "mysql_real_connect thread" (I also looked for alternatives:"mysql_real_connect threaded", "mysql_real_connect multi threaded", etc.). I searched on Google Groups for: mysql_real_connect thread and found a few interesting hits. However, I am still not 100% clear on how to interpret some of the information on this page: http://dev.mysql.com/doc/mysql/en/threaded-clients.html I do a lot of MySQL administration and development using mostly the CLI and a few other tools but I am writing a multithreaded client to automate certain background processing and I need a bit of advice. According to the page in question the function mysql_real_connect() is not "thread-safe". Does that simply mean that I cannot call that function from more than one thread at a time or does that mean that the connection created by one call to the function will be visible to the other threads or what? Just how not "thread-safe" is it? Each thread will have it's own MYSQL structure and I will need to use two different connections per thread at the same time (am I going to need a separate call to mysql_init() for each connection?). I know how to wrap all of my calls to mysql_real_connect() in a critical section or protect them with a mutex if that's all I need to do . If it's not that simple and I do need to compile and link against another library (as the page suggests - sort of) can someone help me to configure my Microsoft Visual C++ .NET (v7) to do it? I said "sort-of" because the page also says that the binary distributions (which I am working with ) already contain the threadsafe library so I wonder if I need to rebuild anything or not. How can I tell? I am an experienced but not well-seasoned C++ developer (not using c# for this). I know the language and can write and debug code just fine (I can make stand-alone apps and DLLs all day); it's just that some of the complier/linker options and settings that confound me and I am having trouble translating the advice on the page into specifics I can work with for my environment. I know I probably left out some simple pieces of information, just let me know and I will respond ASAP. Please remember to CC: both lists on all responses. Shawn Green Database Administrator Unimin Corporation - Spruce Pine -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]