У меня есть объект, для которого я хотел бы отслеживать количество потоков, ссылающихся на него. В общем, когда вызывается какой-либо метод объекта, я могу проверить локальное логическое значение потока, чтобы определить, был ли счет обновлен для текущего потока. Но это не помогает мне, если пользователь говорит, использует boost :: bind для привязки моего объекта к функции boost :: и использует это для запуска boost :: thread. Новый поток будет иметь ссылку на мой объект и может держаться за него в течение неопределенного периода времени, прежде чем вызывать какие-либо его методы, что приведет к устаревшему счету. Я мог бы написать свою собственную оболочку вокруг boost :: thread, чтобы справиться с этим, но это не помогает, если пользователь boost :: bind - это объект , который содержит мой объект (я не могу специализироваться на основе наличия типа элемента - по крайней мере, я не знаю, как это сделать) и использует это для запуска boost :: thread.Обнаруживает, когда объект передается в новый поток на C++?
Есть ли способ сделать это? Единственное, что я могу придумать, требует слишком много работы от пользователей - я предоставляю оболочку вокруг boost :: thread, которая вызывает специальный метод hook для передаваемого объекта при условии, что он существует, и пользователи добавляют специальный метод hook в любой класс который содержит мой объект.
Редактировать: Ради этого вопроса мы можем предположить, что я управляю средствами для создания новых потоков. Поэтому я могу включить boost :: thread, например, и ожидать, что пользователи будут использовать мою завернутую версию, и не придется беспокоиться о пользователях одновременно с использованием pthreads и т. Д.
Edit2: Можно также предположить, что у меня есть некоторые средства потока местное хранилище, через __thread
или boost::thread_specific_ptr
. Это не в нынешнем стандарте, но, надеюсь, скоро.
Я думаю, что очень сложно решить вашу проблему. Это потому, что ссылки - это бит или память, указывающие на другую ячейку памяти (+ более или менее дополнительный материал). Поскольку память разделяется между потоками, вы не можете определить, какой поток принадлежит ссылке, просто потому, что все потоки «владеют» памятью, все они владеют ссылками. Это не значит, что это невозможно, но поскольку техническая база всегда делится вещами, это трудно сделать. – mmmmmmmm
Да, я надеялся, что, контролируя, как создаются потоки, я мог бы как-то обойти это. Я редактировал свой пост, чтобы сделать эту возможность понятной. –