Я новичок в многопоточном программировании, поэтому этот вопрос может показаться немного глупым, но мне действительно нужно разобраться в этом, поэтому я могу применить его к моему проекту (что намного сложнее). Следуйте моему коду, я пытаюсь иметь 2 потока (родительский и дочерний) для обновления одного и того же общего таймера при их выполнении и остановки, когда таймер достигает определенного предела. Но когда я компилирую и выполняю это, следуйте части кода, есть два разных результата: 1. дочерние отпечатки «сделано дочерним по 200000», но программа не выходит; 2. после того, как дочерние отпечатки «сделанные дочерним по 200000» и завершены, родитель продолжает выполнение, печатает несколько десятков строк «родительская работа» и «родительский элемент в 190000», затем печатает «сделано родителем по 200000» и программа выходы должным образом. Поведение, которое я хочу, относится к тем потокам, которые обновляют таймер, достигают предела и выходят, а другой поток должен прекратить выполнение и выйти. Я думаю, что, возможно, мне не хватает чего-то тривиального, но я попытался изменить код по-разному, и ничто из того, что я пытался, похоже, работает. Любая помощь будет оценена :)C++ многопоточное программирование с таймером
#include <iostream>
#include <unistd.h>
#include <mutex>
#include <time.h>
using namespace std;
mutex mtx;
int main() {
int rc;
volatile int done = 0;
clock_t start = clock();
volatile clock_t now;
rc = fork();
if (rc == 0) { //child
while (true) {
cout << "child doing work" << endl;
mtx.lock();
now = clock() - start;
if (done) {
mtx.unlock();
break;
}
if (now >= 200000 && !done) {
done = 1;
cout << "done by child at " << now << endl;
mtx.unlock();
break;
}
cout << "child at " << now << endl;
mtx.unlock();
}
_exit(0);
}
else { // parent
while (true) {
cout << "parent doing work" << endl;
mtx.lock();
now = clock() - start;
if (done) {
mtx.unlock();
break;
}
if (now >= 200000 && !done) {
done = 1;
cout << "done by parent at " << now << endl;
mtx.unlock();
break;
}
cout << "parent at " << now << endl;
mtx.unlock();
}
}
return 0;
}
'volatile' не делает то, что, по вашему мнению, использует std :: atomic <>. И вы не тестируете потоки, а процессы - 'fork' создает новый процесс, а не новый поток в вашем процессе. –
У вас нет двух потоков, но родительский и дочерний процессы (это совершенно разные). –
Пожалуйста, прекратите использование 'volatile'. Для 'fork' и процессов вы можете прочитать http://beej.us/guide/bgipc/ для IPC. – knivil