Является ли функция pthreads функцией PrintHello()
потокобезопасной? Я нахожу эти примеры в Интернете, но я не понимаю, как они могут быть потокобезопасными. С другой стороны, если я добавлю мьютекс вокруг кода в функции PrintHello()
, тогда пример не будет многопоточным, поскольку все потоки будут ждать в очереди, пока предыдущий поток не завершит функцию PrintHello()
. Кроме того, перемещение его в класс не помогло бы, так как члену было бы статически объявлено, что указатели на нестатические функции не допускаются с CreateThread()
. Любой способ решить это?Thread-safe CreateThread?
#include <WinBase.h>
#include <stdio.h>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#define NUM_THREADS 500
DWORD PrintHello(LPVOID oHdlRequest)
{
long tid;
tid = (long)GetCurrentThreadId();
/* randomly sleep between 1 and 10 seconds */
int sleepTime = rand() % 10 + 1;
sleep(sleepTime);
printf("Hello World! It's me, thread #%ld!\n", tid);
return 0;
}
int main (int argc, char *argv[])
{
/* initialize random seed: */
srand (time(NULL));
HANDLE threads[NUM_THREADS];
long t;
DWORD nThreadID;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
threads[t] = CreateThread(
// Default security
NULL,
// Default stack size
0,
// Function to execute
(LPTHREAD_START_ROUTINE)&PrintHello,
// Thread argument
NULL,
// Start the new thread immediately
0,
// Thread Id
&nThreadID
);
if (!threads[t]){
printf("ERROR; return code from CreateThread() is %d\n", GetLastError());
exit(-1);
}
}
}
Что вы подразумеваете под "thread safe". Безопасно от * what *? – dlev
@dlev http://en.wikipedia.org/wiki/Thread_safety «Часть кода является потокобезопасной, если она управляет только совместно используемыми структурами данных таким образом, чтобы гарантировать безопасное выполнение несколькими потоками одновременно». В простом примере выше это повлечет за собой, что 'printf' может повторить неправильный идентификатор потока. – 2013-05-13 07:49:14
В этом определении говорится, что безопасность потоков - это выполнение кода, которое является «безопасным». Это не очень полезно :). Несмотря на это, я хочу сказать, что трудно определить, какие безопасные средства для потоков: никаких сбоев? Согласованные данные для абонентов? Обновленные данные? В этом случае код, похоже, не управляет общим состоянием, поэтому, как явствует из вышеприведенного определения, он тривиально «потокобезопасен». Тем не менее, я рекомендую вам прочитать эту статью: http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx – dlev