由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教一个c语言实现多线程的问题
相关主题
C 多线程的一个问题在main()里面创建了几个线程,如何等待所有线程都结束?
请问一个多线程与volatile关键字的问题。Pthread一个牵涉两个线程同步,每轮先串行后并行的问题
再次请教关于AIX中线程以及优先级的问题关于线程读写全局变量的问题
重复利用threads的问题C++ 有没有像go routine/channel 一样的库/框架?
如何GDB调试因pthread_cond_wait()阻塞的线程? (转载)用volatile退出线程对不对?(C++)
怎么 kill 一个 thread 啊Bihai,你就用atmoic完事了
怎么知道一个线程结束没有?c++ private 问题
[合集] 为什么多个线程生成的随机数是一样的?double-checked locking
相关话题的讨论汇总
话题: handle话题: dword话题: hthread话题: __
进入Programming版参与讨论
1 (共1页)
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
13
多谢各位了:)
x****u
发帖数: 44466
14
是的。

【在 j**7 的大作中提到】
: 嗯,释放就是closehandle就好了吧
1 (共1页)
进入Programming版参与讨论
相关主题
double-checked locking如何GDB调试因pthread_cond_wait()阻塞的线程? (转载)
问个设计模式的问题吧,STL里面怎么 kill 一个 thread 啊
java的同步问题请教怎么知道一个线程结束没有?
求助: 一个奇怪的bug[合集] 为什么多个线程生成的随机数是一样的?
C 多线程的一个问题在main()里面创建了几个线程,如何等待所有线程都结束?
请问一个多线程与volatile关键字的问题。Pthread一个牵涉两个线程同步,每轮先串行后并行的问题
再次请教关于AIX中线程以及优先级的问题关于线程读写全局变量的问题
重复利用threads的问题C++ 有没有像go routine/channel 一样的库/框架?
相关话题的讨论汇总
话题: handle话题: dword话题: hthread话题: __