VISWESWARAN1998 Ответов: 1

Использование демонического процесса с использованием объектов и классов в C++


Сэр, я изучаю потоковое Программирование с использованием программирования на C++. Я могу создать демон потоков с помощью такой функции,

void print(std::string name)
{
	std::cout << name;
}
int main()
{
	for (int i = 0; i < 10; i++)
	{
		std::thread t(print, "Name\n");
		t.detach();
	}
	int stay;
	std::cin >> stay;
	return 0;
}


Но у меня есть класс, и функция-член класса вызывается с помощью другого класса (не с помощью наследования), а путем создания объекта с private в качестве типа доступа, чтобы единственный класс мог вызывать функции другого класса с помощью объекта.

Это мой код:
class Schedule
{
private:
	std::vector<std::string> name_list;
public:
	void add(std::string name)
	{
		name_list.push_back(name);
	}
};

class Add
{
private:
	Schedule obj;
public:
	void push()
	{
		for (int i = 0; i < 10; i++)
		{
			// I dont know how to make this as a daemon process
			obj.add("NAME");
		}
	}
};


Я не знаю, как сделать функцию add как демонический процесс.

Что я уже пробовал:

Я пытался обратиться к этому вопросу,
c++ - запуск потока с функцией-членом-переполнение стека[^]

Не нашел на этом никаких успехов!

Я следовал этому учебнику, ссылка на поток-C++ [^]
но не нашел того, что хотел.

Я не знаю, что делать, поэтому я пришел сюда, пожалуйста, помогите мне, сэр!
Все, что угодно, даже ссылка, могло бы помочь мне в изучении этого.

Спасибо за ваше время

Richard MacCutchan

Как только процесс отсоединен, вы не можете использовать ни один из его объектов или методов напрямую. Вам нужно использовать какой-то кросс-процессный механизм, такой как общая память, IPC, сокеты и т. д.

[no name]

Итак, сэр, можем ли мы создать регулярные потоки, если да, то как мы можем это сделать, не могли бы вы поделиться какими-либо ссылками для справки, чтобы я мог учиться на них? Спасибо

Richard MacCutchan

Погуглите любое из этих слов.

[no name]

Сэр, я поискал в гугле и не нашел того, что мне нужно. Пожалуйста, помогите мне, сэр. Даже ссылка поможет мне учиться. Спасибо

Richard MacCutchan

У меня нет никаких ссылок, вот почему я сказал вам использовать Google.

[no name]

Я искал, сэр, но до сих пор ничего не могу найти по этому поводу. Не могли бы вы пожалуйста, помогите мне Спасибо

1 Ответов

Рейтинг:
12

Jochen Arndt

Ваш пример не имеет смысла. Потоки используются для длительных операций или для приостановки при ожидании событий. Но вы хотите выполнить короткую операцию (вектор push_back) несколько раз внутри цикла.

Ответ на ваш вопрос довольно прост:

// obj.add("NAME");
std::thread th(&Schedule::add, &obj, "NAME");
th.detach();

Но это потребовало бы блокировки внутри вашего add() функция где mut это std::mutex член класса:
void add(std::string name)
{
    std::unique_lock<std::mutex> lk(mut);
    name_list.push_back(name);
}

Поэтому лучшим решением было бы добавить функцию в класс Schedule, которая создает поток, выполняющий эту операцию:
void add_threaded(std::string name)
{
    std::thread th(&Schedule::add, this, name);
    th.detach();
}

Но эти решения, вероятно, потребляют больше времени, чем непоточный код.

В приведенных выше примерах создаются потоки с нестатической функцией-членом. Для тех, кто std::thread конструктор требует адрес функции-члена и указатель на класс, за которым следуют необязательные аргументы.

Удивительно но их не так много std::thread учебники, охватывающие функции членов класса в интернете, как и ожидалось. Таким образом, не должно быть слишком сложно найти один или несколько полезных.
Примеры:
Многопоточность в C++0x часть 1: Запуск потоков[^]
В C++11: СТД::потоки управляются указанном классе | Рафал Цесляк блог[^]
Совершенно новый здесь, в CP, который охватывает обработку сообщений, которые могут быть более подходящими для вас (сигнализация потока в Schedule класс для добавления элементов):
C++ std::цикл событий потока с очередью сообщений и таймером[^]


[no name]

Благодарю вас за ваше доброе решение, сэр. Я уже давно ищу ответ на этот вопрос в интернете. Да, мой пример не имеет смысла, я просто попробовал эти вещи для обучения. Еще раз спасибо