Как заставить программу работать таким образом? - PullRequest
0 голосов
/ 12 июля 2011

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

Я приведу близкий пример

static void *program_thread(void *thread)
{

    bool somevar = true;

    if(somevar)
    {
        work = getwork();
    }

    dowork(work);

    if(condition1 blah blah)
        somevar = false; /* disable getwork */

    if(condition2)
       somevar = true; /* condition was either met or not met, so we request 
new work either way */  

}

Затем с помощью pthreads (и я пропущу некоторый код) я делаю

int main(blah)
{
    if (pthread_create(&thr->pth, NULL, program_thread, thread_number)) {
        printf("%s","program thread create failed");
        return 1;
    }
}

Теперь я начну объяснять.Количество создаваемых потоков задается пользователем, поэтому я делаю цикл for и создаю столько потоков, сколько мне нужно.Каждый поток вызывает

work = getwork();

Таким образом, получая независимую работу, однако ЦП работает медленно для такой работы.Он пытается что-то вычислить, пробуя 2 ^ 32 числа (то есть от 1 до 4 294 967 296)

Но мой процессор может делать только около 3 миллионов чисел в секунду, и к тому времени он достигает 4 миллиардов чисел, он перезапущен (для новой работы).

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

Проблема в том, что я не могу контролировать, какую работуон получает, поэтому я должен получить

work = getwork();

перед началом потоков.Вопрос в том, КАК?Использование pthread_create очевидно ... но что потом?

1 Ответ

0 голосов
/ 12 июля 2011

Вы можете сделать это несколькими способами:

  • разбить ваш рабочий пакет на более мелкие части (таким образом, ваш getWork возвращает новую, меньшую работу)
  • храните свою работу в обычном месте, к которому вы обращаетесь из своей ветки, используя шаблон чтения-записи
  • из pthread API , четвертый параметр передается вашему потоку, вы можете сделать что-то вроде следующего кода:

    Work = getWork();
    if (pthread_create(&thr->pth, NULL, program_thread, (void*) &work))
           ...
    

    И ваша функция program_thread была бы такой

    static void *program_thread(void *pxThread)
    {
      Work* pWork = (Work*) pxThread;
      ...
    

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

Я не уверен, что полностью понял вашу проблему, но это может дать вам несколько советов, скорее всего. Также обратите внимание, что при выполнении многопоточности необходимо учитывать конкретные проблемы, такие как условия гонки, одновременный доступ и более сложный жизненный цикл объектов ...

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