IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Thread et base de donnée


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 95
    Par défaut Thread et base de donnée
    Bonjour,

    Je suis actuellement en train d'écrire une petite application. Elle consiste à télécharger des pages web, extraire des meta keyword et des liens. Ces liens et ces metakeyword sont inséré dans la base de donnée. Et je télécharge à nouveaux les liens et les keywords.

    J'ai besoin que plusieurs thread écrivent et lisent dans cette base. Je viens de passer plusieurs heures à me remémorer ce que j'avais appris sur les mutex, les sémaphores etc... et je dois avouer que ça me dépasse un peu.

    Je pensais donc à une chose solution : est ce qu'il serai possible de bloquer l'écriture ou la lecture dans la base? C'est à dire qu'un seul thread ne peut avoir accès à la base, que ce soit en écriture ou en lecture.
    Je pensais à une variable de classe (le patern singleton je crois). Je vérifie qu'aucun thread n'accède à la base, si c'est le cas on bloque, puis on y accède.

    Pensez vous que c'est une bonne solution? Et quel outil utiliser? J'aimerai faire une opération atomique :

    "Si aucun thread n'accède à la base, je bloque l'accès". Mais du coup, ça revient à faire une exclusion mutuelle si j'ai bien compris.

    Est ce que le fait de bloquer ma base optimisera quand même mon programme? Je pense que le thread passera 80% du temps à envoyer la requette et télécharger la page. Il passera 20% du temps à lire ou écrire dans la base. C'est ce que je suppose, êtes vous d'accord avec cette idée?

    Donc si ces 20% ne sont pas effectué en multithread, ça devrai quand même optimiser mon programme logiquement, non?


    J'ai lu cette doc en particulier sur boost http://miles.developpez.com/tutoriel...ost/thread/#LI

    mais j'avoue que je n'ai rien compris aux concepts de ScopedLock, TryLock etc... Je n'ai pas trouvé les explications clair.


    J'espère vous avoir exposé clairement mon problème. Merci pour votre attention, n'hesitez pas à me demander des précisions.

    Merci!

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Zorgloub Voir le message
    Bonjour,

    Je suis actuellement en train d'écrire une petite application. Elle consiste à télécharger des pages web, extraire des meta keyword et des liens. Ces liens et ces metakeyword sont inséré dans la base de donnée. Et je télécharge à nouveaux les liens et les keywords.

    J'ai besoin que plusieurs thread écrivent et lisent dans cette base. Je viens de passer plusieurs heures à me remémorer ce que j'avais appris sur les mutex, les sémaphores etc... et je dois avouer que ça me dépasse un peu.

    Je pensais donc à une chose solution : est ce qu'il serai possible de bloquer l'écriture ou la lecture dans la base? C'est à dire qu'un seul thread ne peut avoir accès à la base, que ce soit en écriture ou en lecture.
    Je pensais à une variable de classe (le patern singleton je crois). Je vérifie qu'aucun thread n'accède à la base, si c'est le cas on bloque, puis on y accède.

    Pensez vous que c'est une bonne solution? Et quel outil utiliser? J'aimerai faire une opération atomique :

    "Si aucun thread n'accède à la base, je bloque l'accès". Mais du coup, ça revient à faire une exclusion mutuelle si j'ai bien compris.

    Est ce que le fait de bloquer ma base optimisera quand même mon programme? Je pense que le thread passera 80% du temps à envoyer la requette et télécharger la page. Il passera 20% du temps à lire ou écrire dans la base. C'est ce que je suppose, êtes vous d'accord avec cette idée?

    Donc si ces 20% ne sont pas effectué en multithread, ça devrai quand même optimiser mon programme logiquement, non?


    J'ai lu cette doc en particulier sur boost http://miles.developpez.com/tutoriel...ost/thread/#LI

    mais j'avoue que je n'ai rien compris aux concepts de ScopedLock, TryLock etc... Je n'ai pas trouvé les explications clair.


    J'espère vous avoir exposé clairement mon problème. Merci pour votre attention, n'hesitez pas à me demander des précisions.

    Merci!
    Pour avoir fait la même chose dans un autre environnement (multi thread qui ecrivent et lisent dans une base de données), je ne m'était pas posé de question et j'avais laissé le moteur de la base de données gérer ses propres lock.

    Cela fonctionnait avec une base de données "SQL Server" et "MySQL" et je suppose que cela fonctionne avec toutes les bases de données dignes de ce nom.

    Je ne sais pas si cela répond à ta problématique

    Raymond
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    La majorité des bases de données basées sur le model client/serveur implémentent une gestion de transaction.

    Pour ce qui est de SQLite, il s'agit d'un lock sur le fichier.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Je suis du même avis, les transactions n'ont pas été inventées sans raison.
    Néanmoins, vu que tes threads n'ont pas besoin d'accéder à ta base en permanence, il faut se poser la question du coup de maintient et/ou de l'établissement des connexions. En java, on utilise généralement un pool de connexions, j'ignore si il en existe de facilement utilisable en C++.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    ACE et boost::asio en proposent je crois.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ca c'est de connexions tcp, ce qu'il faudrait c'est un pool de connexions vers base de données.

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En dernier recours, il doit pouvoir bricoler ça avec ACE à coup sûr...

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La gestion de la concurrence fait partie de l'implémentation d'un SGBDR. (c'est même le plus dur à faire)

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 95
    Par défaut
    Merci pour vos explications. Ca commence à se clarifier pour moi.

    J'essai maintenant de compiler un exemple simple que j'ai trouvé sur le net avec les pthread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #define NUM_THREADS     5
     
    void *PrintHello(void *threadid)
    {
       int tid;
       tid = (int)threadid;
       printf("Hello World! It's me, thread #%d!\n", tid);
       pthread_exit(NULL);
    }
     
    int main (int argc, char *argv[])
    {
       pthread_t threads[NUM_THREADS];
       int rc, t;
       for(t=0; t<NUM_THREADS; t++){
          printf("In main: creating thread %d\n", t);
          rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
          if (rc){
             printf("ERROR; return code from pthread_create() is %d\n", rc);
             exit(-1);
          }
       }
       pthread_exit(NULL);
    }
    Mais j'obtiens l'erreur suivante :

    ~/developpement/essai_thread$ gcc -o essai test_pthread.c
    /tmp/ccgyqLNO.o: In function `main':
    test_pthread.c.text+0x80): undefined reference to `pthread_create'
    collect2: ld a retourné 1 code d'état d'exécution


    J'ai installé les librairies :

    libpthread-stubs0 - pthread stubs not provided by native libc
    libpthread-stubs0-dev - pthread stubs not provided by native libc, development files


    Mais cela n'a rien changé. Je précise qu'à l'origine, il n'y avait pas dans ce code la librairie <stdlib.h>, je l'ai ajouté pour éviter une autre erreur. Je vous en parle parce que cela vous aidera peut-être à diagnostiquer le problème. Mes recherches sur google ne m'ont pas vraiment aidé.

    Auriez-vous une idée svp? une piste? ou quoique ce soit qui puisse me faire avancer?

    Merci à tous.

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 95
    Par défaut
    J'aurai du tourner 7 fois ma langue dans ma bouche... J'ai trouvé ce qui manquait : l'option -lpthread pour gcc. Je ne sais pas encore pourquoi exactement, mais je pense que je vais rapidement comprendre.

    Il me vient donc une autre question : je n'ai pas non plus réussi à compiler ce code (cette fois avec les thread boost) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <boost/thread/thread.hpp>
    #include <iostream>
     
    int count = 0;
    boost::mutex mutex;
     
    void increment_count()
    {
            boost::mutex::scoped_lock lock(mutex);
            std::cout << "count = " << ++count << std::endl;
    }
     
    int main(int argc, char* argv[])
    {
            boost::thread_group threads;
            for (int i = 0; i < 10; ++i)
                    threads.create_thread(&increment_count);
            threads.join_all();
    }

    J'ai le même type d'erreur : undefined reference to `boost::mutex::mutex()'

    Aurai-je également besoin de certaines options supplémentaire pour compiler le tout ?

    Merci encore

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il faut que tu lies avec libboost_thread_gcc.....a, voir la documentation de Boost à ce sujet.

    MAT.

  12. #12
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    pour les threads posix, tu devais simplement ajouter -lthread à ta ligne de compilation

Discussions similaires

  1. Thread qui parcourt une base de données et extrait un champ
    Par Mednet dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2013, 19h03
  2. Réponses: 7
    Dernier message: 17/09/2012, 06h13
  3. Threads et base de données
    Par r0seBa dans le forum C#
    Réponses: 10
    Dernier message: 30/03/2012, 14h59
  4. [PHP 5.2] Multi threading et base de donnée
    Par misakilou dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2012, 13h31
  5. Lecture dans la base de donnée et thread
    Par abbd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/01/2008, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo