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
> 
> 
> 

Reply via email to