quit
.#include <time.h>
#include <pthread.h>
#include <stdbool.h>
#include <string.h>
static bool quit = false;
static void* thread_process() {
time_t last_cycle = 0;
while(!quit) {
if(difftime(time(NULL), last_cycle) > 30) {
last_cycle = time(NULL);
// Тут мои грязные дела
}
}
pthread_exit(NULL);
return NULL;
}
int main() {
pthread_t th;
pthread_create(&th, NULL, thread_process, NULL);
char cmd[16];
while(true) {
scanf("%s", cmd);
if(!strcmp(cmd, "quit")) {
quit = true;
break;
}
// остальные команды
}
pthread_join(th, NULL);
pthread_exit(NULL);
return 0;
}
!quit
, потому что quit не меняется в этой функции и в функциях вызываемых из неё.Может стоит вынести флаг в параметры потока
while(!quit) { if(difftime(time(NULL), last_cycle) > 30) { last_cycle = time(NULL); // Тут мои грязные дела } }
sleep
или что-нибудь типа pthread_mutex_timedlock
/pthread_cond_timedwait
.#include <sys/time.h>
#include <pthread.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
struct thread1 {
pthread_mutex_t lock;
pthread_cond_t cond;
bool quit;
};
static void* thread_process(void *p) {
struct thread1 *arg = p;
for (;;) {
bool quit;
pthread_mutex_lock(&arg->lock);
if (!arg->quit) {
struct timeval now;
struct timespec ts;
gettimeofday(&now, NULL);
ts.tv_sec = now.tv_sec + 30;
ts.tv_nsec = now.tv_usec * 1000;
pthread_cond_timedwait(&arg->cond, &arg->lock, &ts);
}
quit = arg->quit;
pthread_mutex_unlock(&arg->lock);
if (quit)
return NULL;
// Тут мои грязные дела
}
return NULL;
}
int main() {
pthread_t th;
struct thread1 arg = {
.lock = PTHREAD_MUTEX_INITIALIZER,
.cond = PTHREAD_COND_INITIALIZER,
.quit = false,
};
pthread_create(&th, NULL, thread_process, &arg);
char cmd[16];
while(true) {
scanf("%s", cmd);
if(!strcmp(cmd, "quit")) {
pthread_mutex_lock(&arg.lock);
arg.quit = true;
pthread_cond_broadcast(&arg.cond);
pthread_mutex_unlock(&arg.lock);
break;
}
// остальные команды
}
pthread_join(th, NULL);
return 0;
}