2016-06-29 2 views
1

Ich habe zwei Threads , thread2 mit Routinen func1, func2 jeweils. Auf der Basis einer Variablen cnt möchte ich nun die Ausführungsreihenfolge dieser beiden Threads ändern. Das heißt, wenn cnt wird selbst dann ausführen func1 dann func2 else if cnt ungerade wird dann ausführen func2 dann func1 .I haben, es zu tun, wenn cnt von 1 bis 100.Wie ändert man die Ausführungsreihenfolge von zwei Threads auf der Basis von ungeraden oder geraden Zahlen in C?

Ich habe durch die Verwendung von Semaphoren erreichen nur . Ich habe versucht, es mit dem folgenden Code zu lösen. Aber der Code ist nicht gut genug.

#include<stdio.h> 
#include<pthread.h> 
#include<semaphore.h> 

int cnt=1; 
sem_t e_lock,o_lock; 

void* func1() 
{ 
    while(cnt<=100) 
    { 
    if(cnt%2==0)  //if even exec then p1 
    { 
     printf("value of count: %d\n",cnt); 
     sem_wait(&e_lock); 
     printf("even execution, process 1 first\n"); 
    }else 
    { 
     sem_post(&o_lock); 
     printf("odd execution, process 1 second\n"); 
     cnt++; 
    } 
    } 
} 

void* func2() 
{ 
    while(cnt<=100) 
    { 
    if(cnt%2!=0)  //if odd exec then p1 
    { 
     printf("value of count: %d\n",cnt); 
     sem_wait(&o_lock); 
     printf("odd execution, process 2 first\n"); 
    }else 
    { 
     sem_post(&e_lock); 
     printf("even execution, process 2 second\n"); 
     cnt++; 
    } 
    } 
} 
void main() 
    { 

    pthread_t thread1,thread2; 

    pthread_create(&thread1,NULL,func1,NULL); 
    pthread_create(&thread2,NULL,func2,NULL); 

    pthread_join(thread1,NULL); 
    pthread_join(thread2,NULL); 
    } 

Bitte erläutern Sie die Änderungen.

+0

Ich denke, du überdenkst es und lässt 'main()' nicht seinen Teil dazu beitragen. Zumindest würde ich jeden Thread blockieren und 'main()' die Signalisierung durchführen lassen. – unwind

+5

Es gibt keinen Grund, Threads auf diese Weise zu verwenden. Wenn Sie Dinge nacheinander tun müssen, verwenden Sie keine Threads. –

+0

Es ist richtig, dass ich keine Threads verwenden muss, wenn eine sequenzielle Ausführung benötigt wird. Aber das ist die Herausforderung. – Midhun

Antwort

0

Sie haben vergessen, die gemeinsam benutzte Variable cnt als volatile zu erklären:

volatile int cnt=1; 

Ohne volatile, der Compiler Code zu generieren erlaubt wurde, in dem der Wert der Variablen in einem Register gehalten wird, und Änderungen von den anderen Thread möglicherweise nicht gesehen werden.

Verwandte Themen