在 C 语言中,线程是一种并发执行的机制,允许多个代码片段在同一程序中同时执行。C 语言提供了许多线程相关的 API,包括创建和管理线程的函数、线程同步的函数等。在线程创建时,我们通常需要指定一个函数作为线程的入口点。在 C 语言中,线程入口点可以使用 ThreadStart 和 ParameterizedThreadStart 两种委托类型。
1. ThreadStart 委托类型
ThreadStart 委托类型代表一个无参无返回值的方法,可以作为线程入口点使用。
```csharp
// 定义一个 ThreadStart 委托类型
typedef void (*ThreadStart)(void);
```
ThreadStart 委托类型定义了一个函数指针,指向一个无参无返回值的函数。这个函数就是线程的入口点。当我们创建一个新线程时,需要将一个指向线程入口点的函数指针作为参数传递给线程创建函数。例如:
```csharp
#include #include #include void* thread_func(void* arg) { printf("Hello from thread_func!\n"); return NULL; } int main(int argc, char** argv) { pthread_t thread; pthread_create(&thread, NULL, thread_func, NULL); pthread_join(thread, NULL); printf("Program completed.\n"); return 0; } ``` 在上面的例子中,我们使用 pthread_create 函数创建了一个新线程,并传递了一个函数指针 thread_func 作为线程入口点。thread_func 是一个无参无返回值的函数,它将在新线程中执行。pthread_join 函数用于等待线程执行完毕后才会继续执行主线程中的代码。 2. ParameterizedThreadStart 委托类型 ParameterizedThreadStart 委托类型代表一个有参无返回值的方法,可以作为线程入口点使用。 ```csharp // 定义一个 ParameterizedThreadStart 委托类型 typedef void (*ParameterizedThreadStart)(void*); ``` ParameterizedThreadStart 委托类型定义了一个函数指针,指向一个有一个 void* 类型参数并且无返回值的函数。这个类型的委托通常用于传递给线程入口点一个参数。当我们创建一个新线程时,需要将一个指向这种类型函数的函数指针作为参数传递给线程创建函数,并通过线程创建函数的最后一个参数传递参数。例如: ```csharp #include #include #include void* thread_func(void* arg) { int* number = (int*)arg; printf("Hello from thread_func! Argument is: %d\n", *number); return NULL; } int main(int argc, char** argv) { int number = 42; pthread_t thread; pthread_create(&thread, NULL, thread_func, &number); pthread_join(thread, NULL); printf("Program completed.\n"); return 0; } ``` 在上面的例子中,我们使用 pthread_create 函数创建了一个新线程,并传递了一个函数指针 thread_func 作为线程入口点。thread_func 是一个有一个参数且返回值为 void* 的函数,它将在新线程中执行。最后一个参数 &number 是一个指向 int 类型变量的指针,它将作为参数传递给线程入口点函数。 3. 区别与案例 总结一下,ThreadStart 委托类型和 ParameterizedThreadStart 委托类型的区别可以归纳为是否需要传递参数: 1. 如果线程入口点不需要参数,可以使用 ThreadStart 委托类型; 2. 如果线程入口点需要参数,可以使用 ParameterizedThreadStart 委托类型。 下面给出一个简单的案例来说明两种委托类型的使用。 假设我们需要从 1 数到 10,并打印每个数字和线程 ID。我们可以定义一个线程入口点函数 CountToTen: ```csharp void CountToTen() { for (int i = 1; i <= 10; ++i) { printf("Thread %ld: %d\n", pthread_self(), i); } } ``` 其中 pthread_self() 是获取当前线程 ID 的函数。 这个函数没有参数,可以使用 ThreadStart 委托类型作为线程入口点。创建线程的代码如下: ```csharp pthread_t thread; pthread_create(&thread, NULL, (void*)&CountToTen, NULL); ``` 注意,由于 C 语言不支持直接将函数名作为指针传递,我们需要使用 (void*)&CountToTen 将函数名强制转换为指针。 接下来,我们假设我们需要从 1 数到 n,并打印每个数字和线程 ID。我们可以定义一个线程入口点函数 CountToN: ```csharp void CountToN(void* arg) { int n = *(int*)arg; for (int i = 1; i <= n; ++i) { printf("Thread %ld: %d\n", pthread_self(), i); } } ``` 这个函数需要一个 int 类型的参数 n,我们可以使用 ParameterizedThreadStart 委托类型作为线程入口点。创建线程的代码如下: ```csharp pthread_t thread; int n = 10; pthread_create(&thread, NULL, (void*)&CountToN, &n); ``` 最后,我们需要使用 pthread_join 函数等待线程执行完毕。完整的代码如下: ```csharp #include #include #include void CountToTen() { for (int i = 1; i <= 10; ++i) { printf("Thread %ld: %d\n", pthread_self(), i); } } void CountToN(void* arg) { int n = *(int*)arg; for (int i = 1; i <= n; ++i) { printf("Thread %ld: %d\n", pthread_self(), i); } } int main(int argc, char** argv) { pthread_t thread1, thread2; // 线程1:调用 CountToTen 函数 pthread_create(&thread1, NULL, (void*)&CountToTen, NULL); // 线程2:调用 CountToN 函数,参数为 20 int n = 20; pthread_create(&thread2, NULL, (void*)&CountToN, &n); // 等待线程执行完毕 pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Program completed.\n"); return 0; } ``` 输出结果为: ``` Thread 140621732554752: 1 Thread 140621732554752: 2 Thread 140621732554752: 3 Thread 140621732554752: 4 Thread 140621732554752: 5 Thread 140621732554752: 6 Thread 140621732554752: 7 Thread 140621732554752: 8 Thread 140621732554752: 9 Thread 140621732554752: 10 Thread 140621724162048: 1 Thread 140621724162048: 2 Thread 140621724162048: 3 Thread 140621724162048: 4 Thread 140621724162048: 5 Thread 140621724162048: 6 Thread 140621724162048: 7 Thread 140621724162048: 8 Thread 140621724162048: 9 Thread 140621724162048: 10 Thread 140621724162048: 11 Thread 140621724162048: 12 Thread 140621724162048: 13 Thread 140621724162048: 14 Thread 140621724162048: 15 Thread 140621724162048: 16 Thread 140621724162048: 17 Thread 140621724162048: 18 Thread 140621724162048: 19 Thread 140621724162048: 20 Program completed. ``` 可以看出,线程1 调用的是 CountToTen 函数,线程2 调用的是 CountToN 函数,并传入了参数 20。在 CountToN 函数中,我们使用了类型转换和解引用操作来获取参数值。 以上就是 C 中 ThreadStart 和 ParameterizedThreadStart 的详细介绍和用法,希望能对你有所帮助。 壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。 我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复