PrintHello()
関数 pthreads の例はスレッドセーフですか? この種の例をオンラインで見つけましたが、スレッドセーフにする方法がわかりません。一方、関数内のコードの周りにミューテックスを追加するPrintHello()
と、前のスレッドが関数を終了するのを待ってすべてのスレッドがキューに入れられるため、例はマルチスレッド化されませんPrintHello()
。また、非静的関数へのポインターは許可されていない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);
}
}
}