Nano Hash - криптовалюты, майнинг, программирование

spinLock блокирует систему

Я пытаюсь использовать spinlockIsr_t в vxWorks 6.7, но если я пытаюсь использовать его с несколькими задачами, система зависает. Разрешено ли вам использовать несколько задач, которые пытаются получить одну и ту же спин-блокировку? Если нет, то какой в ​​этом смысл изначально? Следующий код работает с 1 или 2 задачами, но как только количество задач увеличивается до 3, система зависает, не успев закончить печать первой строки на консоли.

spinlockIsr_t mySpinLock; 
int sharedResource;
void vx_test_mtx_spin_lock(void)
{
    const int kNumTask = 3;
    const int kTaskPriority = 50;
    const int kTaskStackSize = 10000;
    int i = 0;
    sharedResource = 0;
    char procName[40];
                                                printf("Number of tasks : %d\n", kNumTask);
                                                printf("SPIN_LOCK_ISR_INIT() [main task]\n");
    SPIN_LOCK_ISR_INIT (&mySpinLock, 0);        printf("SPIN_LOCK_ISR_TAKE() [main task] \n");
    SPIN_LOCK_ISR_TAKE (&mySpinLock);
    for (i = 0; i < kNumTask; i++){
        sprintf(procName, "%s%d", "myTask", i); printf("taskSpawn() [main task]\n");
        taskSpawn((char*)procName,
                kTaskPriority,
                0,
                kTaskStackSize,
                (FUNCPTR)vx_spin_lock_unlock,
                0,0,0,0,0,0,0,0,0,0
                );
    }                                           printf("SPIN_LOCK_ISR_GIVE() [main task]");
    SPIN_LOCK_ISR_GIVE (&mySpinLock); 

}

void vx_spin_lock_unlock(void)
{
                                                printf("SPIN_LOCK_ISR_TAKE() [spawned task] \n");
    SPIN_LOCK_ISR_TAKE (&mySpinLock);
    /* ... Access the share resource here */    printf("SPIN_LOCK_ISR_GIVE() [spawned task] \n");
    SPIN_LOCK_ISR_GIVE (&mySpinLock);       
}

Ответы:


1

Я подозреваю, что у вас есть задача с более высоким приоритетом, вращающаяся на спин-блокировке, в то время как задача с более низким приоритетом уже удерживает блокировку. Задача с более низким приоритетом никогда не сможет быть запущена, поэтому блокировка никогда не снимается, и возникает взаимоблокировка. Спин-блокировки в принципе никогда не должны использоваться в системах реального времени. Если они используются, вы должны убедиться, что все потоки, которые могут вращаться на блокировке, имеют одинаковый приоритет.

15.08.2012
  • +1 - Я видел, как спин-блокировки обрушили целый кластер - 7 ящиков застряли, один ящик зациклился :(( 15.08.2012
  • Катастрофы спин-блокировки обычно описываются как «живая блокировка» :( 15.08.2012
  • Хорошо, приятно знать. Извините, у меня нет формального образования в области параллелизма, поэтому я не всегда знаю правильные термины. 15.08.2012
  • Основная задача, которая изначально использует Spin Lock, имеет наивысший приоритет 1, а порожденные задачи имеют приоритет 50, поэтому нельзя разрешать основной задаче снимать блокировку и позволять другим порожденным задачам завершить свое выполнение. 15.08.2012
  • Делает ли основная задача каждую попытку повторного получения спин-блокировки после ее первого освобождения? 15.08.2012
  • printf должен иметь свою собственную блокировку, чтобы предотвратить повреждение выходного буфера - возможно, это тоже спин-блокировка :(( 15.08.2012
  • Я сомневаюсь в этом. Использование спин-блокировок для внутреннего stdio в реализации, предназначенной для систем реального времени, было бы ужасно плохим. 15.08.2012
  • @R.. - о да, пропустил тег «VxWorks» :( 16.08.2012

  • 2

    Это действительно неправильное применение spinLocks. В большинстве случаев вы должны просто использовать семафор мьютекса вместо spinLock.

    SpinLocks предназначены для очень короткого критического раздела. Выполнение строковых операций и операций ввода-вывода (т. е. printf) не является коротким. То же самое с выполнением taskSpawn.

    На самом деле выполнение любого системного вызова при удерживании спин-блокировки — огромный красный флаг.

    15.08.2012
  • +1, побочные эффекты начинаются с пустой траты ядра процессора и пропускной способности памяти, а затем ухудшаются :( 15.08.2012
  • Причина, по которой я пытаюсь создать задачу, удерживая спин-блокировку, заключается в проверке оболочки вокруг спин-блокировок. 15.08.2012

  • 3

    Сколько ядер у вас в этой системе? Есть ли что-нибудь, чтобы вытеснить вращающиеся задачи? Так как все ваши задачи крутятся на замке, как только вы привязали все свои ядра - игра окончена.

    15.08.2012
  • 2 ядра. Нет ничего, что вытесняет задачи. Основная задача имеет приоритет 1, в то время как порожденные задачи имеют приоритет 50, поэтому я предполагал, что основная задача будет запланирована и даст блокировку вращения, даже если порожденные задачи вращаются на блокировке. 15.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..