Простая синхронизация потока

Прежде всего, $ko не содержит результатов запроса, пока вы не передадите ему закрытие, в данном случае ->first().

$ko =  DB::select('SELECT * FROM points WHERE round="first" ORDER BY points DESC , run_rate DESC LIMIT 4')->first();

Далее вам нужно сравнить значение $ko->team с $matches->team1 или $matches->team2:

if($ko->team == $matches->team1 || $ko->team == $matches->team2) {
  ...
}

Наконец, некоторые очистить. Запрос БД может быть упрощен для использования синтаксиса Eloquent вместо необработанного SELECT:

$ko = DB::table("points")
->where("round", "=", "first")
->orderBy("points", "DESC")
->orderBy("run_rate", "DESC")
// ->limit(4) // Removing this; incompatible with `->first()`
->first();

Есть еще одна логическая ошибка; если вам нужно limit(4), то вы не можете использовать ->first(), вам придется использовать ->get(), который затем создает Collection, который нельзя сравнить с $matches, если вы не выполните цикл:

$kos = DB::table("points")...->get();

$matches->round = "first";
foreach($kos AS $ko){
    if($ko->team == $matches->team1 || $ko->team == $matches->team2) {
        $matches->round = "ko";
        break;
    }
}

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

Редактировать: Так как вы выполняете цикл и сравнение, установите значение по умолчанию $matches->round на «first», затем, при циклировании, если условие сравнения - true, переопределите $matches->round на «ko» и прервите из цикла.

7
задан Nick 11 March 2009 в 16:21
поделиться

5 ответов

Критические разделы будут работать (они - более легкий вес это взаимные исключения.) InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection и DeleteCriticalSection являются функциями для поиска на MSDN.

void func()
{
    // cs previously initialized via InitializeCriticalSection
    EnterCriticalSection(&cs);
    operation1();
    operation2();
    LeaveCriticalSection(&cs);
    operation3();}
}

Править: Критические разделы быстрее, чем взаимные исключения, так как критические разделы являются, прежде всего, примитивами непривилегированного режима - в случае не спорившего, получают (обычно общий падеж) нет никакого системного вызова в ядро, и получение берет порядок десятков циклов. Переключатель ядра является более более дорогим (на порядке сотен циклов). Единственный строго ограниченный во времени вызов разделов в ядро в порядке для блокирования, который включает ожидание на примитивном ядре, (или взаимное исключение или событие). Получение взаимного исключения всегда включает вызов в ядро и является таким образом порядками величины медленнее. Однако критические разделы могут только использоваться для синхронизации ресурсов в одном процессе. Для синхронизации через несколько процессов взаимное исключение необходимо.

19
ответ дан 6 December 2019 в 04:46
поделиться

Фиксация решения Michael выше.

Решение Michael идеально подходит для приложений C. Но при использовании в C++ этому стилю препятствуют из-за posability исключений. Если исключение произойдет в operation1 или operation2 затем, то критический раздел правильно не оставят, и все другие потоки заблокируют ожидание.

// Perfect solutiuon for C applications
void func()
{
    // cs previously initialized via InitializeCriticalSection
    EnterCriticalSection(&cs);
    operation1();
    operation2();
    LeaveCriticalSection(&cs);
    operation3();}
}

// A better solution for C++
class Locker
{
    public:
    Locker(CSType& cs): m_cs(cs)
    {
        EnterCriticalSection(&m_cs);
    }
    ~Locker()
    {
        LeaveCriticalSection(&m_cs);
    }
    private:
        CSType&  m_cs;
}
void func()
{
    // cs previously initialized via InitializeCriticalSection
    {
        Locker  lock(cs);
        operation1();
        operation2();
    }
    operation3();
}
27
ответ дан 6 December 2019 в 04:46
поделиться

Лучший метод должен был бы использовать критический раздел, использовать EnterCriticalSection и LeaveCriticalSection. Единственная ticky часть - то, что необходимо инициализировать критический раздел сначала с InitializeCriticalSection. Если этот код в классе, поместите инициализацию в конструктора и структуру данных CRITICAL_SECTION как член класса. Если код не является частью класса, необходимо, вероятно, использовать глобальное или что-то подобное, чтобы гарантировать, что это инициализируется однажды.

6
ответ дан 6 December 2019 в 04:46
поделиться
  1. использование MFC:

    1. Определите объект синхронизации. (Раздел Mutext или Critical)

      1.1 Если несколько потоков, принадлежащих другому процессу, входят, func () затем используют CMutex.

      1.2. Если несколько потоков того же процесса входят, func () затем используют CCriticalSection.

    2. CSingleLock может использоваться для упрощения использования объектов синхронизации.

Позволяет говорят, что мы определили критический раздел

 CCriticalSection m_CriticalSection;
    void func()
    {
         // locking/mutex statement goes here
         CSingleLock aLock(&m_CriticalSection, **TRUE**); 
       // TRUE indicates that Lock aquired during aLock creation.
       // if FALSE used then use aLock.Lock() for locking.

         operation1();
         operation2();
          // corresponding unlock goes here
          aLock.Unlock();
         operation3();
    }

Править: Отошлите статью VC ++ из MSDN: Многопоточность с C++ и Классами MFC и Многопоточность: Как Использовать Классы Синхронизации

6
ответ дан 6 December 2019 в 04:46
поделиться

Можно попробовать это:

void func()
{
    // See answer by Sasha on how to create the mutex
    WaitForSingleObject (mutex, INFINITE);
    operation1();
    operation2();
    ReleaseMutex(mutex);
    operation3();
}
2
ответ дан 6 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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