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]

Reply via email to