Не хотелось бы зря потратить время на изучение не того, что нужно.
!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;
}
>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
func(func(x, y), func(x, y))
add(add(5, 10), add(5, 10)) == add(15, 15) == 30
randrange
на hash(input())
, и попробовать пропихнуть как решение.from numpy import zeros, uint32
from random import randrange
from sys import getsizeof
N = 10 ** 6
hashes = zeros(N, uint32)
print(f'hashes занимает {getsizeof(hashes)} байт')
control = set() # здесь считаем по-честному
for i in range(N):
# вместо строк я использую большие случайные числа
r = randrange(0x4000000000000000)
control.add(r)
# сохраняем последние 4 байта r - больше не лезет
hashes[i] = r & 0xffffffff
hashes.sort()
a, cnt = hashes[0], 1
for b in hashes:
if a != b:
a = b
cnt += 1
print(f'control - целых {getsizeof(control)} байт (для строк длиной до 1к было бы больше)')
print(f'{cnt:8} разных хэшей\n{len(control):8} разных чисел')
bitmap, cnt = bytearray(0x400000), 0
for _ in range(int(input())):
h, f = hash(input()), 0
for _ in range(16):
m = b'\x01\x02\x04\x08\x10\x20\x40\x80'[h & 7]
h = ((h >> 4) ^ i) | ((h & 15) << 60)
if not bitmap[h & 0x3fffff] & m:
bitmap[h & 0x3fffff] |= m
f = 1
cnt += f
print(cnt)
N = int(input())
s = set()
for i in range(N):
s.add(input())
print(len(s))
N = int(input())
s = set()
for i in range(N):
s.add(hash(input()))
print(len(s))
Очень не хочется портить трудовую 2-мя месяцами работы.Трудовую вашу увидят только после того, как примут решение взять на работу. Соответственно, вы можете вообще в резюме не указывать, что где-то в это время работали. Это первое. Второе - если вы всё же будете бодаться и указывать эту компанию в резюме, то как только потенциальные работодатели позвонят на прошлое место работы и услышат про суд, ваша кандидатура из рассмотрения, скорее всего, выпадет.