Хотите избежать одного звонка в семпост для восьми потоков - PullRequest
1 голос
/ 08 января 2010

Сценарий:

    nthreads = 8
    for j=0 = nthreads
        pthread_created (thread_func)


    for 1=0 to 1000
    {
        // Some work.

        for j=0 = nthreads
          sempost(mutex1)

        // thread_func()

        for j=0 = nthreads
          semwait(mutex2)

       // Some work.

    }

    thread_func()
    {
        while(1)
        {
            semwait(mutex1)

            // Thread funcionality.
            sempost(mutex2)
        }
    }

Que: Я хочу более эффективную технику синхронизации, чем текущая. Я хочу удалить один вызов на sempost (всего 8, один на один поток) как минимум. В то же время я хочу, чтобы каждый поток начал свою работу одновременно.

Как этого достичь?


выполнение барьера или семпоста / ожидания каждым потоком потребовало бы тех же затрат. Я хочу удалить один набор sempost / wait или один барьер в вашем случае

1 Ответ

2 голосов
/ 08 января 2010

То, что вы хотите - это барьер, который блокирует ожидающие потоки, пока все потоки не войдут в барьер_ваит (). В зависимости от реализации потоков, у вас уже может быть барьерный примитив (например, pthread_barrier).

Другой вариант - условное ожидание (cond_wait), которое идеально подходит для вашего варианта запуска.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...