2010-04-23 3 views
2

Deux threads vont utiliser le même func(). Les deux threads doivent s'exclure mutuellement. Comment puis-je le faire fonctionner correctement?Comment puis-je m'assurer que deux threads exécutant la même fonction s'excluent mutuellement

(sortie doit être "ABCDEABCDE")

char arr[] = "ABCDE"; 
int len = 5; 

void func() { 
    for(int i = 0; i <len;i++) 
     printf("%c",arr[i]); 
} 
+1

est ce devoir? – WhirlWind

+0

non !!! C'est quelque chose qui me dérange – nisnis84

+1

pourquoi pas simplement 'printf ("% s ", arr)'? – Vlad

Répondre

7

Créer un mutex? En supposant que vous utilisez pthread,

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

.... 

void func() { 
    int errcode = pthread_mutex_lock(&mutex); 
    // deal with errcode... 
    // printf... 
    errcode = pthread_mutex_unlock(&mutex); 
    // deal with errcode... 
} 

Voir https://computing.llnl.gov/tutorials/pthreads/#Mutexes pour un tutoriel.

+0

puis-je le faire avec un code élémentaire ?? comme si ou si ?? ou dois-je utiliser des fonctions spéciales? – nisnis84

+0

Vous devez utiliser des instructions spéciales - lire à propos de l'atomicité. – WhirlWind

+2

@nisnis: Non, vous devez utiliser des fonctions spéciales.Le code élémentaire n'est pas sensible au thread (certaines langues ont un bloc spécial 'synchronize' /' lock' qui fonctionne comme un mutex, mais pas 'while' ou' if'.) – kennytm

1
  1. Dans le thread principal, initialisez mutex m.
  2. Dans le thread principal, créez deux threads qui commencent tous les deux dans une fonction x().
  3. En x(), obtenez mutex m.
  4. En x(), appelez func().
  5. En x(), libère mutex m.
0

Depuis que vous avez étiqueté ce C++, vous devez savoir que C++ 11 inclut des fonctionnalités de bibliothèque standard spécifiquement pour gérer le verrouillage.

std::mutex std::lock_guard

#include <mutex> 

std::mutex arr_mutex; 
char arr[] = "ABCDE"; 
int len = 5; 

void func() { 
    // Scoped lock, which locks mutex and then releases lock at end of scope. 
    // Classic RAII object. 
    std::lock_guard<std::mutex> lock(arr_mutex); 

    for(int i = 0; i <len;i++) 
     printf("%c,arr[i]); 
} 
+0

C++ 11 pour quelque chose de 2010? ;-) –

Questions connexes