-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


TLS ("thread-local storage", не "transport layer security")

Вторник, 14 Июля 2020 г. 00:39 + в цитатник
JoeUser:
Цитата Qraizer @
P.S. Вариант с thread_local без extern ничего не поменяет. Всё равно в src1 и src2 это будут разные объекты.

Тогда не понимаю, о чем ты споришь :)

Смотри

static. Для src1 и src2 - это разные объекты, принадлежащие своим единицам транстяции.
thread_local. Для src1 и src2 - это также разные объекты, принадлежащие своим единицам транстяции.

Разница лишь во времени существования. static - существуют все время жизни программы. А thread_local - время жизни потока.

Пусть есть однопоточная либа SRC и ее однопоточное использование:

    // src.h --------------------------------------------------------------------------
    #ifndef SRC_H
    #define SRC_H
    #include
    void set(int i);
    void prn();
    #endif // SRC_H
    // src.cpp ------------------------------------------------------------------------
    #include "src.h"
    static int State;
    void set(int i) {
    State = i;
    }
    void prn() {
    std::cout << State << std::endl;
    }
    // main.cpp -----------------------------------------------------------------------
    #include
    void func(int i) {
    set(i);
    prn();
    }
    int main() {
    func(12);
    return 0;
    }

Ничего необычного. Запустили функцию, которая вызвала изменение "состояния библиотеки" и потом печать. Увидели 12.

А теперь желаем эту либу использовать в многопоточной среде. В самой "либе" меняем static на thread_local. Ну а основную прогу переписываем под многопоточное исполнение:

    // src.h --------------------------------------------------------------------------
    #ifndef SRC_H
    #define SRC_H
    #include
    void set(int i);
    void prn();
    #endif // SRC_H
    // src.cpp ------------------------------------------------------------------------
    #include "src.h"
    thread_local int Value;
    void set(int i) {
    State = i;
    }
    void prn() {
    std::cout << State << std::endl;
    }
    // main.cpp -----------------------------------------------------------------------
    #include
    #include
    #include
    #include
    #include
    std::mutex Mutex;
    void func(int i) {
    set(i);
    std::this_thread::sleep_for(
    std::chrono::milliseconds(500 + ((std::rand() % 20) * 300))
    );
    std::lock_guard Guard(Mutex);
    std::cout << "(" << std::this_thread::get_id() << "): ";
    prn();
    }
    int main() {
    std::srand(343452345);
    std::thread trd1(func, 10);
    std::thread trd2(func, 20);
    std::thread trd3(func, 30);
    trd1.join();
    trd2.join();
    trd3.join();
    return 0;
    }

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

    (4): 30
    (2): 10
    (3): 20

Ну, получается получается простая замена static на thred_local позволяет нам получить желаемое многопоточное использование?

https://forum.sources.ru/index.php?showtopic=419143&view=findpost&p=3834208

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку