none
Если создаётся пул из нескольких потоков, то нужно ли вызывать SubmitThreadpoolWork столько раз, сколько в пуле потоков? RRS feed

  • Вопрос

  • Скажите, пожалуйста следующее. Вот я создаю пул из пяти потоков:

    VOID WordCount::CountWordsInTextFiles_with_ThreadPool(struct WordCountContext* p_WordCountContext)
    {
    	. . . . . . . . . . . . . . . . . . .
    	TP_CALLBACK_ENVIRON CallBackEnviron;
    	PTP_POOL pool = NULL;
    	BOOL bRet = FALSE;
    	. . . . . . . . . . . . . . . . . . .
    	PTP_WORK work = NULL;
    	PTP_WORK_CALLBACK workcallback = CountWordsInFiles;
    
    	// Инициализировать среду в которой будет выполняться функция CountWordsInFiles
    	InitializeThreadpoolEnvironment(&CallBackEnviron);
    	// Создать пул потоков.
    	pool = CreateThreadpool(NULL);
    	
    	. . . . . . . . . . . . . . . . . . .
    
    	// УКАЗАТЬ МАКСИМАЛЬНОЕ И МИНИМАЛЬНОЕ КОЛИЧЕСТВО ПОТОКОВ В ПУЛЕ, РАВНОЕ 5.
    	SetThreadpoolThreadMaximum(pool, 5);
    	bRet = SetThreadpoolThreadMinimum(pool, 5);
    	
    	. . . . . . . . . . . . . . . . . . .
    
    	// Создать работу с окружением выполнения функции CountWordsInFiles
    	work = CreateThreadpoolWork(workcallback, (void*)p_WordCountContext, &CallBackEnviron);
    
    	// Передать работу в пул потоков.
    	SubmitThreadpoolWork(work);
    	
    	. . . . . . . . . . . . . . . . . . .
    
    	return;
    }

    И здесь, как вы можете видеть, я вызываю

    SubmitThreadpoolWork(work);
    всего один только раз. Приложение у меня работает, но появляется следующий вопрос: Используется ли рабочий колбэк CountWordsInFiles() всеми пятью потоками или же только одним? Т.к. SubmitThreadpoolWork() вызывается только один раз. В http://stackoverflow.com/questions/8357955/windows-api-thread-pool-simple-example приведён пример создания пула потоков из 10 потоков и там SubmitThreadpoolWork() вызывается в цикле 10 раз. Скажите, пожалуйста, нужно ли и мне у себя вызывать эту функция в цикле 5 раз? Это мое первое в жизни приложение с созданием и использованием пула потоков и я буду очень благодарен за помощь.

    17 декабря 2014 г. 10:24

Ответы

  • В другой теме у вас в функции CountWordsInFiles применены критические секции таким образом, что функция будет выполняться только одним потоком. Так что сколько бы вы ни создали потоков, выполнять функцию будет только один, а остальные ждать.

    Начните с чего-то более простого, без чтения файлов. Просто работайте с несколькими переменными в потоках, при этом выводя на консоль их значения и идентификатор потока, чтобы наглядно видеть, в каком потоке что изменяется.

    • Помечено в качестве ответа Purple_Apple 17 декабря 2014 г. 12:45
    17 декабря 2014 г. 11:38