Прикрепление указателя к pthread - PullRequest
0 голосов
/ 23 апреля 2019

В моей программе есть структура под названием clock_thread, которая имеет решающее значение для моей системы потоков.Это в основном поток, который выполняет операции с постоянной скоростью.

Иногда некоторые функции необходимо синхронизировать с clock_thread, но для этого им нужен текущий clock_thread.Я не могу передать clock_thread за аргументы.Я знаю, что могу получить текущий pthread через pthread_self(), но мне как-то нужно прикрепить указатель на pthread, который указывает на структуру clock_thread.

Единственный способ, которым я в настоящее время знаю, для достижения этой цели - это иметь глобальный массив, который отслеживает все clock_thread с, и при необходимости сравнивать pthread каждого clock_thread с текущим pthread с pthread_equal.

Например, clock_thread постоянно вызывает метод do_stuff(), который теоретически может делать что угодно.Единственная цель clock_thread - это вызов функции, она не имеет ничего общего с функциональностью функции.Затем эта функция может вызвать perform_write, которая должна изменить состояние другого clock_thread.Таким образом, он должен знать ток clock_thread, но do_stuff() не должен пропускать ток clock_thread полностью через его логику.В реальной функции код do_stuff гораздо сложнее, и из-за стилистического выбора я не могу передать текущий clock_thread в качестве аргумента.

struct clock_thread memory_thread;

void perform_read(uint16_t addr, uint16_t value) {
    //Needs to sync with other thread
    //But how
    clock_thread_sync(???, memory_thread);
}

void do_stuff() {
    //Do some stuff
    perform_write(addr, 0x1234);
}

Есть ли лучший способ выполнитьэтот?Я бы хотел как можно больше избегать глобальных переменных.

1 Ответ

0 голосов
/ 23 апреля 2019

Я решил проблему, потому что функция do_something() знает, в каком потоке она находится (другая структура, на которую есть указатель). perform_read() теперь принимает текущий clock_thread в качестве аргумента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...