Я пытаюсь создать вдохновляемый контекст Golang в C ++ для использования в рабочих потоках и других задачах. Я старался не использовать необработанные указатели, но с тех пор, как я начал писать код C ++, я всегда чувствую, что не уверен, как ведет себя мой код. Я хочу отзывы о моей реализации и потенциальных ошибках. Многие константы были предложением от Linter: < /p>
#pragma once
#include
#include
#include
#include
#include
class Context : public std::enable_shared_from_this {
public:
Context() : cancelled(false) {
}
~Context() {
cancel();
detachFromParent();
}
static std::shared_ptr fromParent(std::shared_ptr &parent) {
auto context = std::make_shared();
if (parent) {
parent->appendChild(context);
context->parent = parent; // Use weak_ptr to prevent circular reference
}
return context;
}
void cancel() {
std::lock_guard lock(mtx);
cancelled = true;
for (const auto &child: children) {
try {
child->cancel();
} catch (...) {
continue;
}
}
cv.notify_all(); // Wake up all waiting threads
}
bool isCancelled() const {
return cancelled.load();
}
void waitForCancel() {
std::unique_lock lock(mtx);
cv.wait(lock, [&]() { return cancelled.load(); });
}
void appendChild(const std::shared_ptr &child) {
std::lock_guard lock(mtx);
children.push_back(child);
}
void removeChild(const std::shared_ptr &child) {
std::lock_guard lock(mtx);
children.remove(child);
}
void detachFromParent() {
if (auto parent_ptr = parent.lock()) {
parent_ptr->removeChild(shared_from_this());
}
}
private:
std::atomic cancelled;
std::mutex mtx;
std::condition_variable cv;
std::list children;
std::weak_ptr parent; // Weak pointer to break circular reference
};
Подробнее здесь: https://stackoverflow.com/questions/795 ... management
Реализация вариации контекста GO в C ++, имея проблемы с управлением памятью ⇐ C++
Программы на C++. Форум разработчиков
1743504266
Anonymous
Я пытаюсь создать вдохновляемый контекст Golang в C ++ для использования в рабочих потоках и других задачах. Я старался не использовать необработанные указатели, но с тех пор, как я начал писать код C ++, я всегда чувствую, что не уверен, как ведет себя мой код. Я хочу отзывы о моей реализации и потенциальных ошибках. Многие константы были предложением от Linter: < /p>
#pragma once
#include
#include
#include
#include
#include
class Context : public std::enable_shared_from_this {
public:
Context() : cancelled(false) {
}
~Context() {
cancel();
detachFromParent();
}
static std::shared_ptr fromParent(std::shared_ptr &parent) {
auto context = std::make_shared();
if (parent) {
parent->appendChild(context);
context->parent = parent; // Use weak_ptr to prevent circular reference
}
return context;
}
void cancel() {
std::lock_guard lock(mtx);
cancelled = true;
for (const auto &child: children) {
try {
child->cancel();
} catch (...) {
continue;
}
}
cv.notify_all(); // Wake up all waiting threads
}
bool isCancelled() const {
return cancelled.load();
}
void waitForCancel() {
std::unique_lock lock(mtx);
cv.wait(lock, [&]() { return cancelled.load(); });
}
void appendChild(const std::shared_ptr &child) {
std::lock_guard lock(mtx);
children.push_back(child);
}
void removeChild(const std::shared_ptr &child) {
std::lock_guard lock(mtx);
children.remove(child);
}
void detachFromParent() {
if (auto parent_ptr = parent.lock()) {
parent_ptr->removeChild(shared_from_this());
}
}
private:
std::atomic cancelled;
std::mutex mtx;
std::condition_variable cv;
std::list children;
std::weak_ptr parent; // Weak pointer to break circular reference
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79548400/implementing-go-context-variation-in-c-having-issues-with-memory-management[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия