j**7 发帖数: 771 | 1 求教一个用C语言实现对多线程的运行结果等待,windows和visualstudio2005环境下(
非Linux pthread,尽量不使用winAPI)。具体如下,使用了_beginthread开始了若干
个线程,但想在主线程中等待这些线程运行结束一遍进行后续操作。不知道是否有单一
函数或简洁操作能够实现。望各位不吝赐教啊~ |
x****u 发帖数: 44466 | 2 waitforsingleobject,msdn上写了。
【在 j**7 的大作中提到】 : 求教一个用C语言实现对多线程的运行结果等待,windows和visualstudio2005环境下( : 非Linux pthread,尽量不使用winAPI)。具体如下,使用了_beginthread开始了若干 : 个线程,但想在主线程中等待这些线程运行结束一遍进行后续操作。不知道是否有单一 : 函数或简洁操作能够实现。望各位不吝赐教啊~
|
j**7 发帖数: 771 | 3 嗯,看到了:)
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
貌似定义一个 HANDLE handle = CreateThread(...)就好了??
那么 _beginthread()能否使用WaitForSingleObject呢??好像它返回的是uintptr_t。
另外,网上搜了一下,有人说CreateThread用多了容易产生泄漏,是这样的么?有没有
什么注意事项可以避免呢??
多谢了
【在 x****u 的大作中提到】 : waitforsingleobject,msdn上写了。
|
x****u 发帖数: 44466 | 4 应该用beginthreadex吧。
这个泄露不是一定存在的,如果你的C库动态链接或者线程内没有使用C函数,就不会有
泄露。但最好还是用beginthread吧。
t。
【在 j**7 的大作中提到】 : 嗯,看到了:) : DWORD WINAPI WaitForSingleObject( : __in HANDLE hHandle, : __in DWORD dwMilliseconds : ); : 貌似定义一个 HANDLE handle = CreateThread(...)就好了?? : 那么 _beginthread()能否使用WaitForSingleObject呢??好像它返回的是uintptr_t。 : 另外,网上搜了一下,有人说CreateThread用多了容易产生泄漏,是这样的么?有没有 : 什么注意事项可以避免呢?? : 多谢了
|
j**7 发帖数: 771 | 5 嗯。
不过我这些个并行的线程要调用自己写的一个比较大的函数,而且要调用很多次,倒没
有标准库里的函数,这样的话是不是就一定不会泄露呢??
查到一个说法:
如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C
runtime library,并使用_beginthreadex和_endthreadex:
1 使用malloc()和free(),或是new和delete
2 使用stdio.h或io.h里面声明的任何函数
3 使用浮点变量或浮点运算函数
4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()
这么说来基本啥都不能用了。beginthread能用waitForSingleObject来等待么?
【在 x****u 的大作中提到】 : 应该用beginthreadex吧。 : 这个泄露不是一定存在的,如果你的C库动态链接或者线程内没有使用C函数,就不会有 : 泄露。但最好还是用beginthread吧。 : : t。
|
x****u 发帖数: 44466 | 6 这里的"应该"和"必须"是有微妙的差别的。
你该用beginthreadex,并且注意线程handle如果不释放是会占用系统资源的。
为了地球的安全和和平,我们最好不要随便违反msdn里面所说的原则,除非你非常清楚
自己在干什么。
()
【在 j**7 的大作中提到】 : 嗯。 : 不过我这些个并行的线程要调用自己写的一个比较大的函数,而且要调用很多次,倒没 : 有标准库里的函数,这样的话是不是就一定不会泄露呢?? : 查到一个说法: : 如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C : runtime library,并使用_beginthreadex和_endthreadex: : 1 使用malloc()和free(),或是new和delete : 2 使用stdio.h或io.h里面声明的任何函数 : 3 使用浮点变量或浮点运算函数 : 4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()
|
s******n 发帖数: 21 | 7 如果同时等多个threads, 可以用WaitForMultipleObjects:
DWORD WINAPI WaitForMultipleObjects(
__in DWORD nCount,
__in const HANDLE *lpHandles,
__in BOOL bWaitAll,
__in DWORD dwMilliseconds
);
nCount should be less than MAXIMUM_WAIT_OBJECTS (64).
t。
【在 j**7 的大作中提到】 : 嗯,看到了:) : DWORD WINAPI WaitForSingleObject( : __in HANDLE hHandle, : __in DWORD dwMilliseconds : ); : 貌似定义一个 HANDLE handle = CreateThread(...)就好了?? : 那么 _beginthread()能否使用WaitForSingleObject呢??好像它返回的是uintptr_t。 : 另外,网上搜了一下,有人说CreateThread用多了容易产生泄漏,是这样的么?有没有 : 什么注意事项可以避免呢?? : 多谢了
|
p***o 发帖数: 1252 | 8 找个写好的wrapper用估计没这些头疼的问题,比如boost thread和pthreads-win32。
移植起来也容易得多。
【在 x****u 的大作中提到】 : 这里的"应该"和"必须"是有微妙的差别的。 : 你该用beginthreadex,并且注意线程handle如果不释放是会占用系统资源的。 : 为了地球的安全和和平,我们最好不要随便违反msdn里面所说的原则,除非你非常清楚 : 自己在干什么。 : : ()
|
O*******d 发帖数: 20343 | 9 HANDLE hThread = (HANDLE)_beginthreadex(.....);
// run thread
WaitForSingelObject(hThread, someTimeOut);
CloseHandle(hThread ); |
O*******d 发帖数: 20343 | 10 You may also use WaitForMultipleObjects to wait of multiple threads. |
j**7 发帖数: 771 | 11 嗯,释放就是closehandle就好了吧
【在 x****u 的大作中提到】 : 这里的"应该"和"必须"是有微妙的差别的。 : 你该用beginthreadex,并且注意线程handle如果不释放是会占用系统资源的。 : 为了地球的安全和和平,我们最好不要随便违反msdn里面所说的原则,除非你非常清楚 : 自己在干什么。 : : ()
|
j**7 发帖数: 771 | 12 嗯,还可以这样啊~
【在 O*******d 的大作中提到】 : HANDLE hThread = (HANDLE)_beginthreadex(.....); : // run thread : WaitForSingelObject(hThread, someTimeOut); : CloseHandle(hThread );
|
j**7 发帖数: 771 | |
x****u 发帖数: 44466 | 14 是的。
【在 j**7 的大作中提到】 : 嗯,释放就是closehandle就好了吧
|