John, You have just made sense of nearly everything. :-D I will work with this and let you know if anything else pops up!
<ASIDE> Hey documentarians! the functions mysql_thread_safe(), mysql_thread_init(), and mysql_thread_end() are not listed on either one of the C-API function overview pages but they still have their own pages elsewhere in the manual. Is this just a snafu or what? I think they should be listed on the overview pages even if they have their own section header to make them easier to find. over view pages: http://dev.mysql.com/doc/mysql/en/c-api-function-overview.html http://dev.mysql.com/doc/mysql/en/c-api-functions.html specific functions: http://dev.mysql.com/doc/mysql/en/mysql-thread-init.html http://dev.mysql.com/doc/mysql/en/mysql-thread-end.html http://dev.mysql.com/doc/mysql/en/mysql-thread-safe.html </ASIDE> Thank you very much!! Shawn Green Database Administrator Unimin Corporation - Spruce Pine "John McCaskey" <[EMAIL PROTECTED]> wrote on 10/07/2005 01:31:24 PM: > 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 > > >