MASQ VS NAT?
Объясните пожалуйста в двух словах, чем маскарадинг отличается от nat?
Объясните пожалуйста в двух словах, чем маскарадинг отличается от nat?
Помогите найти howto, где можно прочитать про установку/настройку djbdns. Интересует только caching-only nameserver. Язык: английский/русский - неважно, я спрашиваю у вас потому, что может быть вы знаете, где про это толково написано. Спасибо.
Решил организовать очереди с потоками - выяснилось, что что-то не так. Поэтому упростил задачу, чтобы найти причину непонятки.
Есть счетчик counter, защищенный мьютексом counter_mutex.
Есть два потока, incrementor и decrementor. Первый увеличивает счетчик, второй - уменьшает, причем только до нуля, после чего ожидает сигнала от первого потока. Есть условная переменная cond, защищенная мьютексом cond_mutex. Поток incrementor после увеличения счетчика вызывает pthread_cond_signal(&cond). Я ожидал, что как только incrementor сигналит, decrementor просыпается, однако...
Вопрос: почему incrementor успевает увеличить счетчик очень много раз,
при этом столько же раз просигналив, а потом только decrementor просыпается, уменьшает счетчик до нуля и уже после этого откликается после каждого сигнала. Код прилагается.
#include <pthread.h>
pthread_mutex_t counter_mutex;
pthread_mutex_t cond_mutex;
pthread_cond_t cond;
pthread_t incrementor_thread;
pthread_t decrementor_thread;
int counter;
void* decrementor(void)
{
printf("decrementor(): called\n");
while(1)
{
while(1)
{
pthread_mutex_lock(&counter_mutex);
if(0 == counter)
{
/* nothing to decrement: suspend */
pthread_mutex_unlock(&counter_mutex);
break;
}
counter--;
pthread_mutex_unlock(&counter_mutex);
} /* inner loop */
pthread_mutex_lock(&cond_mutex);
printf("decrementor(): suspended\n");
pthread_cond_wait(&cond, &cond_mutex);
printf("decrementor(): wake up\n");
pthread_mutex_unlock(&cond_mutex);
} /* outer loop */
}
void* incrementor(void *p)
{
while(1)
{
printf("incrementor(): generating packet\n");
pthread_mutex_lock(&counter_mutex);
counter++;
printf("increment_counter(): counter=%d\n", counter);
pthread_mutex_unlock(&counter_mutex);
pthread_mutex_lock(&cond_mutex);
printf("register_packet(): signalling\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&cond_mutex);
}
}
int main()
{
counter = 0;
pthread_mutex_init(&counter_mutex, NULL);
pthread_mutex_init(&cond_mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&decrementor_thread, NULL, decrementor, NULL);
pthread_create(&incrementor_thread, NULL, incrementor, NULL);
/* loop forever */
while(1) {
sleep(10);
}
return 0;
}