DWORD WINAPI MyThreadProc (LPVOID lpParam)
{
somestruct* pN = (somestruct*)lpParam; // 将参数转为你的类型
...
return 0;
}
创建命令以及各个参数说明:
HANDLE hThread = CreateThread(
NULL, // 没有安全描述符
0, // 默认线程栈的大小
MyThreadProc, // 线程函数指针
(LPVOID)&n, // 传递参数
NULL, // 没有附加属性
NULL // 不需要获得线程号码
);
CloseHandle(hThread); // 如果不需要再监视线程,则关闭线程句柄
#include <windows.h>
#include <stdio.h>
#define MAX_THREADS 10
typedef struct MyData
{
int val1;
int val2;
//char key[32];
}MYDATA;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
MYDATA *pmd = (MYDATA *)lpParam;
printf("%d\n", pmd->val1);
printf("%d\n", pmd->val2);
return 0;
}
DWORD(WINAPI *pThreadProc)(LPVOID lpParam);
void fun()
{
pThreadProc = ThreadProc;
MYDATA mydt[MAX_THREADS];
HANDLE hThread[MAX_THREADS];
int i;
for (i = 0; i < MAX_THREADS; i++)
{
mydt[i].val1 = i;
mydt[i].val2 = i + 1;
hThread[i] = CreateThread(
NULL,// default security attributes
0,// use default stack size
pThreadProc,// thread function
&mydt[i],// argument to thread function
0, // use default creation flags
NULL);
if (hThread[i] == NULL)
{
ExitProcess(i);
}
}
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE); //这样传给回调函数的参数不用定位static或者new出来的了
// Close all thread handles upon completion.
for (i = 0; i < MAX_THREADS; i++)
{
CloseHandle(hThread[i]);
}
}
int main()
{
fun();
//getchar();
return 0;
}
https://blog.youkuaiyun.com/hujingshuang/article/details/53097222 【CUDA】grid、block、thread的关系及thread索引的计算
https://blog.youkuaiyun.com/weixin_36340947/article/details/76283677 CUDA卷积操作—使用constant memory实现高斯滤波
https://blog.youkuaiyun.com/zjc_game_coder/article/details/72398272 c++和cuda混合编程记录(一)
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。
那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开,那么我们的线程该如何知道这个文件现在有没有被别的线程访问呢?我们可以让线程等在一个死循环里,这个循环之一在尝试打开访问这个文件,直到能够打开为止;这样做虽然可以实现目的,但是死循环会占用大量的内存,所以windows就设置了信号量。信号量的作用简单理解就是一个标志位,在我们上述的问题中,这个文件就有一个信号量,初始时我们设信号量为FALSE,而只有当信号量为FALSE时线程才可以打开访问这个文件。那么,当第一个线程到达,信号量为FALSE,线程打开文件进行访问,并将信号量置为TRUE;在第一个线程在访问文件时,第二个线程到来,此时信号量仍未TRUE,所以第二个线程等待,这个等待的过程就是WaitForSingleObject。WaitForSingleObject在等待的过程中会进入一个非常高效的沉睡等待状态,只占用极少的CPU时间片。
WaitForSingleObject()
1. 格式
DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有两个参数,分别是THandle和Timeout(毫秒单位)。
如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。
2. 使用对象
它可以等待如下几种类型的对象:
Event,Mutex,Semaphore,Process,Thread
3. 返回类型
有三种返回类型:
WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因
代码例如下:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std;
int i = 0;
DWORD WINAPI FunProc(LPVOID lpParameter);
DWORD WINAPI FunProc(LPVOID lpParameter)
{
for (; i < 10; i++)
{
if (!(i % 10))
cout << endl;
else
cout << i << endl;
}
return 0;
}
void main()
{
cout << i << endl;
HANDLE hThread;
hThread = CreateThread(NULL, 0, FunProc, NULL, 0, NULL);
DWORD dwRet = WaitForSingleObject(hThread, 1);
if (dwRet == WAIT_OBJECT_0)
{
cout<< "创建的线程执行结束" << endl;
}
if (dwRet == WAIT_TIMEOUT)
{
cout<< "等待超时" << endl;
}
if (dwRet == WAIT_ABANDONED)
{
cout<< "Abandoned" << endl;
}
CloseHandle(hThread);
system("pause");
}
结果为:
这段代码中,首先在开始定义一个变量 i 为 0 ,然后在主函数中先将其输出便有了结果中第一行的 0 。
之后我们开启线程,进入线程函数FunProc,在FunProc中将 i++ 对 10 取余输出,一直到 i > 10 结束循环,线程结束,这是返回给WaitForSingleObject的结果为WAIT_OBJECT_0,表示线程正常结束,并将结果输出。
这其中WaitForSingleObject的效果就相当于一个关卡,只有返回给了WaitForSingleObject结果程序才能继续执行,当然线程不一定能正常执行结束,也可能会出现:
这就是未能等到线程结束信号量的等待时间就耗光了。我们也可以将WaitForSingleObject的第二个参数设置为 INFINITE,就可以一直等待。