【发布时间】:2013-05-13 07:44:27
【问题描述】:
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);
}
}
}
【问题讨论】:
-
“线程安全”是什么意思。远离什么?
-
@dlev en.wikipedia.org/wiki/Thread_safety "如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,那么它就是线程安全的"。在上面的简单示例中,
printf可能会回显错误的线程 ID。 -
该定义说线程安全是“安全”的代码执行。这不是很有帮助:)。无论如何,我的观点是很难定义线程的安全意味着什么:没有崩溃?为来电者提供一致的数据?最新数据?在这种情况下,代码似乎没有操纵共享状态,所以我猜根据上面的定义它是微不足道的“线程安全”。也就是说,我鼓励你阅读这篇文章:blogs.msdn.com/b/ericlippert/archive/2009/10/19/…
-
@IngeHenriksen:这个定义过于简单化了。此外,这里的共享数据结构在哪里?另外,为什么会打印错误的ID?
-
请注意,传递给
printf的参数是可以的,但printf使用的来自不同调用的全局输出流未同步。为了隐藏这种效果,使用了随机睡眠。移除睡眠并增加总线程数 - 您有机会看到损坏的输出。
标签: c++ windows multithreading