sebastian
@sebastian

Знатокам C и mutex?

Имеем код
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

int var = 0;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond;

void * increment() 
{
    while(1)
    {   
        pthread_mutex_lock(&lock);
        ++var;
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&cond);
//        sleep(1);
    }
}

void * _print()
{
    while(1)
    {
        pthread_mutex_lock(&lock);
        pthread_cond_wait(&cond,&lock);
        printf("%d\n", var);
        pthread_mutex_unlock(&lock);
    }



}

int main()
{
    pthread_t th1, th2, th3;
    pthread_create(&th1,NULL,increment, NULL);
    pthread_create(&th2,NULL,_print,NULL);

    pthread_join(th2,NULL);
    pthread_join(th1,NULL);
    return 0;

}



Какого поведения ожидать от программы в зависимости от процессора (архитектура, количество ядер)?

Примеры кусков вывода на разных процессорах:

Раз (intel pentium 4 2 ядра):

498770

498771

498772

498773

498774

498775

498776

498777

498778

498779

498780

498781


! Важно, что числа идут по порядку.


Два(intel core 2 duo):

8413753

8413817

8413880

8413943

8414006

8414067

8414129

8414192

8414259

8414322

8414384


Очень большие провалы.
  • Вопрос задан
  • 4546 просмотров
Пригласить эксперта
Ответы на вопрос 4
TheHorse
@TheHorse
Ну провалы должны быть. ++ порядком легче чем принт, и за одну еденицу времени он выполняется намного чаще… Cond можно убрать, он вроде как лишний тут.

На древнем проце все идет синхронно, вероятно потому, что операции блокировки, порядком сложнее ++ и принт, от того оно и переключает контексты после каждой операции над мьютексом…
Ответ написан
Комментировать
sebastian
@sebastian Автор вопроса
Но ведь мьютекс на то и нужен, чтобы все было по порядку.
Ответ написан
mark_ablov
@mark_ablov
мьютексы в примере лишь гарантируют то, что var++ и print(var) не будут выполнятся параллельно, порядок они никоим образом не обеспечивают в этом примере.
Ответ написан
@tangro
Событие Вам и вправду поможет лучше
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы