Для приложения.NET я выбираю" .NET Parallel Extensions (PLINQ)", это чрезвычайно просто в использовании и позволяет мне параллелизировать существующий код в минутах.
Моно , вероятно, доберется поддержка PLINQ, таким образом, это могло быть межплатформенное решение также.
В полностью оптимизированном коде нет 100% верного способа определить вызывающего абонента определенного метода. Компилятор может использовать оптимизацию хвостового вызова, тогда как компилятор эффективно повторно использует кадр стека вызывающего объекта для вызываемого.
Чтобы увидеть пример этого, установите точку останова для любого заданного метода с помощью gdb и посмотрите на трассировку. Обратите внимание, что вы не видите objc_msgSend () перед каждым вызовом метода. Это потому, что objc_msgSend () выполняет хвостовой вызов для каждой реализации метода.
Хотя вы можете скомпилировать свое приложение без оптимизации, вам понадобятся неоптимизированные версии всех системных библиотек, чтобы избежать только этой проблемы.
И это всего лишь одна проблема; по сути, вы спрашиваете: «Как мне заново изобрести CrashTracer или gdb?». Очень сложная проблема, на которой строятся карьеры.
Создайте макрос, который добавляет __ FUNCTION __
к имени функции при вызове функции. Затем этот макрос вызовет вашу функцию с дополнительным параметром символа * для целевой функции.
В общем случае это невозможно без фактического обхода стека. Нет даже гарантии, что другой объект отправит сообщение, вызывающее метод. Например, его можно вызвать из блока в обработчике сигнала.