Поток/идентификатор процесса C++

Предположим, вы пишете следующий класс с @CachePut,

public class FooBean implements Foo{

    @CachePut
    public String doSomething(){

    }
}

. Spring back scene создаст прокси-сервер AOP, который обернет ваш класс так, что он сможет применять некоторые кеширующие магические коды до или после вызова фактического @CachePut метод. Вы можете думать, что прокси-сервер AOP выглядит следующим образом:

public class FooBeanProxy implements Foo{

    private FooBean fooBean;

    public String doSomething(){

        //Maybe there are some caching magic codes here....
        fooBean.doSomething()
        //Maybe there are other caching magic codes here........
    }
}

Если я переместу этот метод в какой-нибудь другой файл реализации сервиса и вызову этого метода будет работать кэширование.

blockquote>

Предположим, вы делаете следующее для вызова метода @CachePut:

@Component
public class App {

    //FooBeanProxy actually injected HERE
    @Autowired
    private Foo foo;

    public void startDoing(){
        foo.doSomething();
    }
}

То, что Spring вводит для вас, это FooBeanProxy, но не ваш FooBean. Итак, когда вы вызываете этот метод @CachePut, магические коды кэширования будут работать так же, как вы вызываете FooBeanProxy

Скажем, я вызываю метод в том же классе обслуживания, который имеет аннотацию @CachePut в Это. Это не кэшируется.

blockquote>

Это означает, что это само-вызов. Вы вызываете эту ссылку, которая является вашим FooBean экземпляром, но уже не тем FooBeanProxy. Таким образом, эта магия кэширования никогда не будет выполнена, и, следовательно, результат не будет кэширован.

На самом деле то, о чем я говорю выше, уже упоминалось в документах . Если вы все еще хотите, чтобы действие @CachePut действовало в случае самовозбуждения, вы можете использовать ужасное и безобразное решение AopContext.currentProxy(), упомянутое в документах , или использовать AspectJ.

5
задан Adam Bellaire 6 October 2008 в 17:07
поделиться

7 ответов

Нет никакого портативного пути, когда портативный означает путь, который работает над каждой платформой для этого, компилятор C++ существует. Таким путем должна была быть часть стандарта C++, в этом случае это действительно будет работать везде (точно так же, как другие части стандарта C++ работают везде). Все не в стандарте, как гарантируют, не будет работать ни над какой платформой, если состояния платформы для поддержки этого стандарта.

Каждым решением, которое люди предложили здесь, является решение, которое пользуется внешней библиотекой и таким образом может только работать над платформами, поддерживаемыми той библиотекой; и никакая библиотека не доступна для каждой существующей платформы.

Вероятно, тем, который получит Вас дальше всего, является POSIX, после того, как весь каждый UNIX как система пытается поддерживать по крайней мере некоторый POSIX (больше лучше), очень мало может назвать себя действительно быть 100%-ми совместимыми POSIX платформами (например, A/UX, AIX, HP-UX, IRIX, Mac OS X 10.5, MINIX, QNX, Солярис, UnixWare, VxWorks... для именования некоторых, существует больше, конечно). Однако существует вполне несколько платформ, которые предлагают по крайней мере некоторую поддержку POSIX, еще немного, немного меньше, и некоторые почти совместимы POSIX (например, FreeBSD, Linux, NetBSD, BeOS, OpenBSD... и другие).

Windows, к сожалению, далеко от того, чтобы быть тем. NT, используемая, чтобы быть частично POSIX, соответствует, но теперь она более или менее исчезла (Win2000/20003, WinXP, и Vista может все еще быть установлена в режим эмуляции POSIX, переведя некоторый вызов POSIX во внутренние вызовы API путем установки Microsoft Windows Services для UNIX - SFU 3.5 или выше), однако существуют способы получить некоторую функциональность POSIX в Windows через внешние библиотеки также (Cygwin предлагает библиотеки LGPL, которые можно связать с приложением для включения изрядного количества функций POSIX в Windows).

Преимущество POSIX не состоит только в том, что это относительно широко распространено, но также и что это стандартизировано, и можно легко искать стандарт в Интернете. Используя вызовы POSIX можно получить идентификатор потока и идентификатор процесса.

7
ответ дан 18 December 2019 в 08:32
поделиться

У Вас есть несколько путей, но все подразумевают использование внешней библиотеки, абстрагирующей поток для Вас.

Среди популярного выбора, два:

  1. Повышение. Библиотека Thread. Это является самым портативным, но подразумевайте работу с Повышением, которое является библиотекой HUGE
  2. Библиотека Qt. Это менее портативно, и подразумевайте для работы с QT, крупной библиотекой.

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

9
ответ дан 18 December 2019 в 08:32
поделиться

Я всегда думал, что резьба была внешней от C++. В Java существует собственный поток, встроенный на язык.

Необходимо было бы найти портативную библиотеку потока.

1
ответ дан 18 December 2019 в 08:32
поделиться

Единственный путь состоит в том, чтобы пользоваться портативной библиотекой. Идентификатор рекомендует QT (это не должно быть приложение для GUI), или возможно wxWidgets. Если Вы разрабатываете игровой выезд SDL

Также повышение выезда освобождает, у них могло бы быть что-то.

1
ответ дан 18 December 2019 в 08:32
поделиться

Можно также использовать часть библиотеки ACE, которая реализует независимую от платформы обертку. Нахождение PID было бы одним из файлов в библиотеке (возможно, ace_process/ACE_Thread).

1
ответ дан 18 December 2019 в 08:32
поделиться

Я не уверен, насколько портативный они - всего лишь потоки Posix, может быть другая опция, которую Вы хотите, рассматривают. См. также здесь. Я соглашаюсь с комментарием Steve - портативный к который платформы?

0
ответ дан 18 December 2019 в 08:32
поделиться

getpid () является портативным способом получить идентификатор процесса.

0
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: