Если у вас есть два потока, которые необходимо остановить независимо, вам нужны две loop
переменные.
В каждом случае вам необходим мьютекс для защиты доступа к общему loop
переменная для предотвращения неопределенного поведения, поскольку к переменной обращаются из двух потоков (один читает ее, а другой пишет).
Объявите свой мьютекс вместе с переменной, которую он защищает:
struct protected_loop_var{
pthread_mutex_t mutex;
int value;
};
struct protected_loop_var loop1={PTHREAD_MUTEX_INITIALIZER,1};
struct protected_loop_var loop2={PTHREAD_MUTEX_INITIALIZER,1};
Затем, прежде чем получить доступ к каждой переменной loop
, заблокируйте мьютекс и впоследствии разблокируйте мьютекс. Вероятно, проще всего написать отдельные функции для доступа к l oop для инкапсуляции этого.
static int read_loop(struct protected_loop_var* loop){
pthread_mutex_lock(&loop->mutex);
int value=loop->value;
pthread_mutex_unlock(&loop->mutex);
return value;
}
static void write_loop(struct protected_loop_var* loop,int newval){
pthread_mutex_lock(&loop->mutex);
loop->value=newval;
pthread_mutex_unlock(&loop->mutex);
}
Тогда ваш while
в entry
может сказать while(read_loop(&loopvar))
, а в exit_loop
вы можете написать write_loop(&loopvar,0)
вместо loop=0
, где loopvar
равно loop1
или loop2
, в зависимости от ситуации.
Если вам нужно запустить один и тот же код в каждом потоке, вы можете передать адрес l oop переменная для этого потока с помощью аргумента void*
.
В этом конкретном случае * могут работать другие шаблоны, но мьютекс - это общий инструмент, используемый для защиты многопоточного доступа к общей переменной.