Я хотел бы реализовать многопотоковый процесс, который отвечает за запуск потоков параллельно.Процесс многопоточности C с непредвиденным сбоем процессора
Согласно выводам htop, каждая нить потребляет менее 1% процессора, но основная потребляет около 100% процессора.
int main (int argc, char *argv[])
{
struct sigaction action;
int i;
exitReq = 0;
memset(&engine, 0, sizeof(stEngine_t));
engine.NbTasks = 12;
engine.TaskThread = malloc(engine.NbTasks * sizeof(stTask_t));
/* NbTasks = 12 */
for (i = 0; i < engine.NbTasks; i++) {
engine.TaskThread[i] = array[i];
engine.TaskThread[i].initTask();
pthread_create(&engine.TaskThread[i].tId, NULL, my_handler, (void *) &engine.TaskThread[i]);
}
while (!exitReq) {
//.. do stuff as reading external value (if value < limit => exitReq = 1)
sched_yield();
}
for (i = 0; i < engine.NbTasks; i++) {
(void)pthread_cancel(engine.TaskThread[i].tId);
pthread_join(engine.TaskThread[i].tId, NULL);
engine.TaskThread[i].stopTask();
engine.TaskThread[i].tId = 0;
}
free(engine.TaskThread);
memset(&engine, 0, sizeof(stEngine_t));
return 0;
}
static void* my_handler(void* params)
{
stTask_t* ptask = (stTask_t*) params;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
while (!exitReq) {
ptask->launchTask();
pthread_testcancel();
}
pthread_exit(NULL);
}
Людей страницы sched_yield говорит «sched_yield() приводит к тому, вызывающему потоку отказываться от процессора.», Поэтому он был использован внутри цикла.
Я, вероятно, неправильно понял что-то о функции sched_yield(), но есть ли лучший и надежный способ отказаться от CPU в этой конкретной ситуации.
Это все еще занятый цикл, почему бы ему не использовать весь процессор, если никто его не хочет? –
Действительно, цикл работает, но его задача не должна потреблять весь процессор. Это то, что я хочу понять и улучшить. – ogs
OT: одновременный доступ к 'exitReq' должен быть защищен, например, мьютексом. – alk