永发信息网

100分!谁能帮我写一个简单的windows环境下C创建线程的方法,并帮我说明一下,都是些什么意思,谢谢了!

答案:2  悬赏:10  手机版
解决时间 2021-11-14 11:01
  • 提问者网友:雾里闻花香
  • 2021-11-13 19:16
100分!谁能帮我写一个简单的windows环境下C创建线程的方法,并帮我说明一下,都是些什么意思,谢谢了!
最佳答案
  • 五星知识达人网友:底特律间谍
  • 2021-11-13 19:40
用windows API函数CreateThread()创建线程:
#include 
#include 
#include 

DWORD WINAPI fun1(void *p)  //演示函数,将会在新创建的线程中运行的代码
{
int i=0;
for (i = 0; i<50; i++) {
printf("fun1() %d
",i);
}
return 0;
}
int main(int argc,char *argv[])
{
int i;
HANDLE pid_fun=CreateThread(NULL,0,fun1,NULL,0,NULL);//创建一个线程,运行fun1函数
CloseHandle(pid_fun);//关闭线程句柄
for (i = 0; i<50; i++) {//在主线程上执行的代码。
printf("MAIN %d
",i);
}

return 0;

}追问能不能解释一下那四个参数的作用和关闭线程句柄是什么意思呢?追答第一个参数是一个SECURITY_ATTRIBUTES结构体指针。在NT Base系统中它被设为NULL。
第二个参数是用于新创建线程的初始堆栈大小,默认值为0。系统会根据需要动态扩展堆栈的大小。
第三个参数是指向线程函数(例如本例中的fun1)的指标。函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (PVOID pParam) ;
第四个参数为传递新线程函数的参数。
第五个参数通常为0,但当建立的线程不马上执行时可传入常量CREATE_SUSPENDED,ResumeThread()函数可以启动CREATE_SUSPENDED类型的线程。
第六个参数 用于返回新线程的ID号,传入NULL表示不需要返回该线程ID号。

CloseHandle()是关闭线程句柄,并不是关闭线程。线程句柄是一种内核对象,系统维护着每一个内核对象,当每个内核对象引用记数为0时,系统就从内存中释放该对象,CloseHandle就是将该线程对象的引用记数减1。所有的内核对象(包括线程Handle)都是有限的系统资源,用完后一定要closehandle关闭之(就像malloc()之后应该free()一样),如果不这么做,你系统的句柄资源很快就用光了。而且CloseHandle()只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。追问请问线程的返回值返回到哪了?我想用这个返回值追答新线程的返回值和主线程传递给新线程的参数都要通过一个结构体用CreateThread()函数的第四个参数实现,示例程序:
#include 
#include 

typedef struct
{
int arg1;
int arg2;
int rult;
} args;          //参数组,arg1和arg2是传入新线程函数的参数,rult用来保存新线程函数的返回值

DWORD WINAPI at(LPVOID a)    //新线程函数
{
args *pa=(args *)a;
pa->rult=pa->arg1+pa->arg2;
return 0;
}

int main(int argc, char* argv[])
{
args arru={16,29,0};
HANDLE pt=CreateThread(NULL,0,at,&arru,0,NULL); //在新线程上运行at()函数,&arru是主线程与新线程之间的通信管道

if (pt)
{
WaitForSingleObject(pt, INFINITE);
CloseHandle(pt);
printf("%d
",arru.rult);   //读取新线程函数的返回值并输出。
}

return 0;
}追问谢谢!
全部回答
  • 1楼网友:忘川信使
  • 2021-11-13 20:26
#include

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
return 0;
}

int main()
{
HANDLE h=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);//第三个参数指向线程调用的函数,第四个参数指向传递给函数的参数,其余参数都是0,了不了解并没有多大用处
CloseHandle(h);//关闭线程句柄,但线程并没有被关闭,线程直到运行到return 0之前是不会结束的

}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯