Банковский перевод с потоками - PullRequest
0 голосов
/ 28 февраля 2019

Я должен сделать несколько банковских переводов с потоками и сравнительный анализ различных результатов.Я думаю, что время синхронизированного решения с общей блокировкой должно быть хуже, чем одна блокировка для решения учетной записи.

Вот моя реализация с общей блокировкой:

pthread_mutex_t general_mutex;

typedef struct {
    int id;
    double balance;
} Account;

int NThreads = 400; /*Threads number*/

#define N 20             /*Accounts number*/
Account accounts[N];
void transfer(double money, Account* origin, Account* destini) {

    pthread_mutex_lock(&general_mutex); //Init general lock.

    bool wasPosible = withdraw(origin, money);
    if (wasPosible ) deposit(destini, money);

    pthread_mutex_unlock(&general_mutex); //End general lock.
}

Вот реализация синдивидуальная блокировка для учетной записи:

typedef struct {
    int id;
    double balance;
    pthread_mutex_t mutex; // lock to use/modify vars
} Account;

int NThreads = 400; /*Threads number*/

#define N 20             /*Accounts number*/
Account accounts[N];
void transfer(double money, Account* origin, Account* destini) {

    if (from->id < to->id) {
         pthread_mutex_lock(&(origin->mutex));
         pthread_mutex_lock(&(destini->mutex));
    } else {
         pthread_mutex_lock(&(destini->mutex));
         pthread_mutex_lock(&(origin->mutex));
    }

    bool wasPosible = withdraw(origin, money);
    if (wasPosible ) deposit(destini, amount);

    pthread_mutex_unlock(&(origin->mutex));
    pthread_mutex_unlock(&(destini->mutex));
}

Почему решение общей блокировки тратит меньше времени, чем вторая?

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2019

Операция блокировки не бесплатна.Во втором примере вы выполняете вдвое больше операций блокировки / разблокировки, чем в первом.Другие операции кажутся простыми обращениями к памяти, поэтому они не должны длиться очень долго.

Мое мнение таково, что в вашей системе вы проводите больше времени в блокировках, чем в реальной обработке, поэтому увеличивается количество блокировок.не актуально.Может быть иначе, если бы transfer использовал медленный ввод, такой как диск или сеть.

Кстати, как вы сказали в комментарии, 400 потоков, вероятно, снова менее эффективны, чем намного меньшее число.Эмпирическое правило равно количеству ядер, которое вы будете использовать, увеличенное на переменный коэффициент, если обработка тратит время на ожидание ввода-вывода - если нет ввода-вывода, то никогда больше, чем доступные ядра.И верхний предел состоит в том, что объем памяти, используемой всеми потоками, не должен превышать объем памяти, который вы хотите использовать, и что накладные расходы на запуск и синхронизацию потоков остаются намного ниже, чем общее время обработки.

...