Из всего изученного стало понятно, что процессы - это некие "контейнеры", содержащие id, статус, instruction pointer, значение регистров, открытые файлы и другие данные контекста.
какую роль в планировании играют процессы?
Для чего они нужны?
Как планировщик ОС работает с процессами?
Моя единственная догадка в том, что планировщик как бы "заглядывает" в каждый процесс и уже там работает с потоками.
В чем между ними разница и где какой предпочтительно использовать
std::for_each
-- это алгоритм из стандартной библиотеки C++, а tbb::parallel_for
-- это часть intel Threading Building Blocks. Если проект не использует TBB, то выбор очевиден. Если использует, то у tbb::parallel_for
несколько больше возможностей по управлению разбиением интервала на части и выполнением рабочих потоков. "Кадр не находится в модуле". Подскажите с чем это может быть связано
HANDLE h = CreateThread( NULL, 0, factorial(gn), NULL, NULL, NULL );
CreateThread(NULL, 0, factorial, NULL, NULL, NULL)
). 3) если ты сделаешь эти два изменения, тебе прийдётся также переделать передачу параметра в функцию factorial и получение результата её работы. #include <iostream>
#include <thread>
#include <vector>;
using namespace std;
void go(int p) {
while (1) {
cout << p << endl;
}
}
void main() {
thread *t[3];
for (int i = 0; i <= 2; i++) {
t[i] = new thread(go, i);
cout << 123;
}
for (int i = 0; i <= 2; i++) {
t[i]->join();
delete t[i];
}
}
И К примеру выполняется такие команды, как пример инструкция чтения строки из stdin, почему вся ос не глохнет. Типа что в этот момент ожидания времени происходит, Или что ОС все 1000 потоков переключает там каждую 0.0001 секунды?
это нормальная практика, или может быть какая ошибка в случае, когда 2 объекта А одновременно вызывают метод из Б?
int global;
class B
{
static int class_static;
public:
void f()
{
static int function_static;
}
};
Насколько хорошим решением является использование сигналов для выведения потоков из спящего режима, и стоит ли для этого использовать ...
!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;
}
Как я понял, ядра имеют доступ только к своему L1 кэшу, а если поток будет исполняться на другом ядре, то он не увидит свои объекты, которые находятся в кэше другого ядра
Я правильно мыслю?
Не могу понять, почему у меня не отрабатывает std::thread без вызова cout? Как такое вообще возможно?
Есть есть поток, который добровольно не отдает управление ЦП и не должен.
nonvoluntary_ctxt_switches: 68267288
Проблема в том, что системный таймер присылает прерывание LOC (Local timer interrupts) 1000 раз в секунду.
Я бы не хотел манипулировать таймером вообще, или собирать ядро со специальными опциями
Выходит, что на стороне сервера все запросы маршрутизируются через один серверный сокет, забинденый на порту? Как происходит маршрутизация?
//костыли для ожидания окончания работы процессов, чтобы не возиться с мьютексами и семафорами
fclose(f); //после того, как прочитали закрываем программу
id--; //минусуем счётчик потока
Из чего можно заключить: потоки и программы выполняются ПОСЛЕДОВАТЕЛЬНО