在C语言中,使用多线程可以提高程序的并发性和效率。创建一个新的线程需要指定线程函数和线程参数。C语言中提供了两种方法来创建线程函数,分别是ThreadStart和ParameterizedThreadStart。
1. ThreadStart
ThreadStart是最简单的线程函数,它使用通用无参函数。该函数不需要任何参数并返回void,它可以通过线程的参数属性传递其他信息。当新线程被创建时,它开始执行指定的线程函数。
ThreadStart的定义如下:
```
typedef void (*ThreadStart)(void);
```
通过ThreadStart,我们可以轻松地创建一个新线程,但是要注意的是,它不能传递任何参数。
示例代码如下:
```
#include #include void func() { printf("Thread start\n"); Sleep(2000); } int main() { HANDLE hThread; DWORD threadId; hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, NULL, 0, &threadId); if (hThread){ printf("Thread created\n"); WaitForSingleObject(hThread, INFINITE); printf("Thread finished\n"); } return 0; } ``` 在上面的例子中,我们创建了一个线程,该线程使用func()函数作为线程函数,由于func()函数不需要任何参数,所以在线程创建时,我们将最后一个参数设置为NULL。 2. ParameterizedThreadStart ParameterizedThreadStart函数使用有参数的函数作为线程函数。它允许我们将任意数量和任意类型的参数传递给线程函数。 ParameterizedThreadStart作为线程函数与ThreadStart类似,只是它多了一个参数,用来传递线程参数。例如,我们可以将一个结构体作为线程参数,在线程中读取结构体的数据。 ParameterizedThreadStart的定义如下: ``` typedef void (*ParameterizedThreadStart)(void*); ``` 示例代码如下: ``` #include #include #include typedef struct { int arg1; float arg2; }ThreadParams; void func2(void* params) { ThreadParams* p = (ThreadParams*)params; printf("Thread start, arg1: %d, arg2: %f\n", p->arg1, p->arg2); Sleep(2000); } int main() { HANDLE hThread; DWORD threadId; ThreadParams params = { 10, 3.14 }; hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func2, ¶ms, 0, &threadId); if (hThread){ printf("Thread created\n"); WaitForSingleObject(hThread, INFINITE); printf("Thread finished\n"); } return 0; } ``` 在上面的例子中,我们创建了一个线程,该线程使用func2()函数作为线程函数,并将结构体params作为线程参数传递给线程。线程函数内部通过类型转换将params指针转换为ThreadParams结构体类型,并读取其数据。 总结: ThreadStart和ParameterizedThreadStart函数都可以用来创建线程函数,ThreadStart不能传递参数,ParameterizedThreadStart可以传递参数。使用ParameterizedThreadStart函数可以更灵活地传递参数,特别是当需要传递多个参数时。 如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
谓天才,就是努力的力量。