2016-03-01 2 views
0

Я пытаюсь написать небольшой проект на C, чтобы понять некоторые основные механизмы в IPC и разделяемой памяти. Я хотел бы сделать процесс, который увеличивает счетчик и один или несколько процессов, которые рассматривают эту общую переменную и выполняют действия. Было бы неплохо, если бы коды этих процессов сохранялись в функциях. Что-то вродеIPC и/или разделяемая память для Linux для новичков

int counter = 0 ; 

int timer () { counter ++ } ; 

int proc1 () { /* action 1 */ } ; 

int terminator () { if (counter >= 10) /* terminate processes */} ; 

int main () { 
    counter = 0 ; 
    /* launch timer, proc1, and terminator */ 
    return 0 ; 
} 

Может ли кто-нибудь предоставить мне пример о том, как это сделать? Возможно, IPC и разделяемая память не являются правильной техникой, я новичок в этом аргументе.

Спасибо!

ответ

0

Через несколько дней я мог бы найти решение, но используя Posix темы вместо

#include <pthread.h> 

#define N 10 

int counter = 0 ; 
pthread_mutex_t counter_mutex ; 
pthread_cond_t counter_condition ; 

void * increment (void * arg) { 
    int i = 0 ; 
    sleep (1) ; 
    for (i = 0 ; i < N ; i ++) { 
     pthread_mutex_lock (& counter_mutex) ; 
     counter ++ ; 
     pthread_cond_signal (& counter_condition) ; 
     pthread_mutex_unlock (& counter_mutex) ; 
     sleep (1) ; 
    } 
    pthread_exit ((void *) 0) ; 
} ; 

void * watch (void * arg) { 
    pthread_mutex_lock (& counter_mutex) ; 
    while (counter < N) { 
     pthread_cond_wait (& counter_condition , & counter_mutex) ; 
     printf ("counter = %d\n" , counter) ; 
    } 
    pthread_mutex_unlock (& counter_mutex) ; 
    pthread_exit ((void *) 0) ; 
} ; 

int main () { 

    int i ; 
    pthread_t threads [ 2 ] ; 
    pthread_attr_t attr; 

    pthread_mutex_init (& counter_mutex , (void *) 0) ; 
    pthread_cond_init (& counter_condition , (void *) 0) ; 

    pthread_attr_init (& attr) ; 
    pthread_attr_setdetachstate (& attr , PTHREAD_CREATE_JOINABLE) ; 

    pthread_create (& threads [ 0 ] , & attr , increment , (void *) 0); 
    pthread_create (& threads [ 1 ] , & attr , watch , (void *) 0) ; 

    for (i = 0 ; i < 2 ; i ++) { 
     pthread_join (threads [ i ] , (void *) 0) ; 
    } 

    pthread_attr_destroy (& attr) ; 
    pthread_mutex_destroy (& counter_mutex) ; 
    pthread_cond_destroy (& counter_condition) ; 

    return 0 ; 
} ; 

Любые Дис/преимущества в использовании этого метода, чем IPC?

 Смежные вопросы

  • Нет связанных вопросов^_^