Rechercher dans le manuel MySQL
28.7.4.3 Writing C API Threaded Client Programs
The client library is almost thread-safe. The biggest problem is
that the subroutines in sql/net_serv.cc
that read from sockets are not interrupt-safe. This was done
with the thought that you might want to have your own alarm that
can break a long read to a server. If you install interrupt
handlers for the SIGPIPE
interrupt, socket
handling should be thread-safe.
To avoid aborting the program when a connection terminates,
MySQL blocks SIGPIPE
on the first call to
mysql_library_init()
,
mysql_init()
, or
mysql_connect()
. To use your own
SIGPIPE
handler, first call
mysql_library_init()
, then
install your handler.
If “undefined symbol” errors occur when linking
against the libmysqlclient
client library, in
most cases this is because you have not included the thread
libraries on the link/compile command.
The client library is thread-safe per connection. You can let two threads share the same connection with the following caveats:
Multiple threads cannot send a query to the MySQL server at the same time on the same connection. In particular, you must ensure that between calls to
mysql_query()
andmysql_store_result()
in one thread, no other thread uses the same connection. You must have a mutex lock around your pair ofmysql_query()
andmysql_store_result()
calls. Aftermysql_store_result()
returns, the lock can be released and other threads may query the same connection.If you use POSIX threads, you can use
pthread_mutex_lock()
andpthread_mutex_unlock()
to establish and release a mutex lock.Many threads can access different result sets that are retrieved with
mysql_store_result()
.To use
mysql_use_result()
, you must ensure that no other thread is using the same connection until the result set is closed. However, it really is best for threaded clients that share the same connection to usemysql_store_result()
.
You need to know the following if you have a thread that did not create the connection to the MySQL database but is calling MySQL functions:
When you call mysql_init()
,
MySQL creates a thread-specific variable for the thread that is
used by the debug library (among other things). If you call a
MySQL function before the thread has called
mysql_init()
, the thread does
not have the necessary thread-specific variables in place and
you are likely to end up with a core dump sooner or later. To
avoid problems, you must do the following:
Call
mysql_library_init()
before any other MySQL functions. It is not thread-safe, so call it before threads are created, or protect the call with a mutex.Arrange for
mysql_thread_init()
to be called early in the thread handler before calling any MySQL function. If you callmysql_init()
, it will callmysql_thread_init()
for you.In the thread, call
mysql_thread_end()
before callingpthread_exit()
. This frees the memory used by MySQL thread-specific variables.
The preceding notes regarding
mysql_init()
also apply to
mysql_connect()
, which calls
mysql_init()
.
Nederlandse vertaling
U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.
Bij voorbaat dank.
Document heeft de 26/06/2006 gemaakt, de laatste keer de 26/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/mysql-rf-c-api-threaded-clients.html
De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.
Referenties
Deze verwijzingen en links verwijzen naar documenten die geraadpleegd zijn tijdens het schrijven van deze pagina, of die aanvullende informatie kunnen geven, maar de auteurs van deze bronnen kunnen niet verantwoordelijk worden gehouden voor de inhoud van deze pagina.
De auteur Deze site is als enige verantwoordelijk voor de manier waarop de verschillende concepten, en de vrijheden die met de referentiewerken worden genomen, hier worden gepresenteerd. Vergeet niet dat u meerdere broninformatie moet doorgeven om het risico op fouten te verkleinen.