Linux下多线程传参问题

本文详细介绍了使用pthread库在C语言中创建和管理线程的方法。通过两个实例,展示了如何利用pthread_create函数启动多个线程,并传递参数到线程函数中。此外,还解释了如何等待所有线程完成执行,确保主线程不会提前结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法1
pthread_create(&t_a[i],NULL,thread1,(void *)i);

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
void *thread1(void *arg)
{
        printf("In thread %ld, id = %lu\n",(long)arg,pthread_self());
}
void main()
{
        long i;
        int *p;
        printf("%ld\n",sizeof p);
    pthread_t t_a[6];
        for(i=0;i<6;i++){
                pthread_create(&t_a[i],NULL,thread1,(void *)i);
        }
        for(i=0;i<6;i++)
                pthread_join(t_a[i],NULL);
}

方法2
pthread_create(&t_a[i],NULL,thread1,(void *)&index[i]);

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>


void *thread1(void *arg)
{
	printf("In thread %d, id = %lu\n",*(int*)arg,pthread_self());
}
void main()
{
	int i;
	int *p;
	printf("%ld\n",sizeof p);
    pthread_t t_a[6];
	int index[6];
	for(i=0;i<6;i++){
	    index[i]=i;
		pthread_create(&t_a[i],NULL,thread1,(void *)&index[i]);
	}
	for(i=0;i<6;i++)
		pthread_join(t_a[i],NULL);
}

### 函数指针作为参数的用法 函数指针作为一种特殊的指针类型,在 C 和 C++ 中具有重要的作用。它可以用来存储函数的入口地址,并通过该指针调用对应的函数。当函数指针作为参数传递时,可以在另一个函数中动态决定执行哪个函数。 #### 使用场景 函数指针作为参数的主要用途在于实现回调机制或者动态选择要执行的功能模块。这种方式能够提高代码的灵活性和可扩展性[^1]。 --- ### 示例代码:函数指针作为参数 下面是一个简单的例子,展示如何使用函数指针作为参数: ```c #include <stdio.h> // 定义两个简单函数 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } // 接收函数指针作为参数的函数 void calculate(int (*operation)(int, int), int x, int y) { printf("Result: %d\n", operation(x, y)); } int main() { int num1 = 10, num2 = 5; // 调用不同的操作 calculate(add, num1, num2); // 输出加法结果 calculate(subtract, num1, num2); // 输出减法结果 return 0; } ``` 在这个示例中: - `add` 和 `subtract` 是两个普通的整型运算函数。 - `calculate` 函数接收一个指向 `(int, int)` 类型函数的指针作为第一个参数,并根据传入的具体函数指针来计算结果。 运行上述代码会得到如下输出: ``` Result: 15 Result: 5 ``` --- ### 动态加载 DLL 并获取函数地址 除了静态定义外,还可以在运行时动态加载库文件(如 Windows 下的 `.dll` 或 Linux 下的 `.so`),并通过函数指针调用其中的导出函数。以下是基于 Windows 的一个示例[^3]: ```c #include <windows.h> #include <stdio.h> typedef int(*MathOperation)(int, int); int main() { HMODULE hModule = LoadLibrary("math.dll"); // 加载 dll 文件 if (!hModule) { fprintf(stderr, "Failed to load library.\n"); return 1; } MathOperation addFunc = (MathOperation)GetProcAddress(hModule, "AddFunction"); if (!addFunc) { FreeLibrary(hModule); fprintf(stderr, "Failed to get function address.\n"); return 1; } int result = addFunc(10, 5); // 调用动态链接库中的 AddFunction printf("Dynamic Result: %d\n", result); FreeLibrary(hModule); // 卸载 dll return 0; } ``` 此代码展示了如何从外部动态链接库中提取函数地址并将其赋值给函数指针,从而完成特定功能的调用。 --- ### 注意事项 1. **参数匹配** 当将函数指针作为参数传递时,需确保目标函数的实际签名与预期一致。如果参数数量或类型不匹配,则可能导致未定义行为甚至崩溃。 2. **内存管理** 对于动态加载的情况,务必记得释放不再使用的资源(例如卸载已加载的库)。否则可能引发内存泄漏等问题。 3. **线程安全** 若多个线程共享同一个函数指针对象,则应考虑同步措施以防止竞争条件的发生。 --- ### 总结 函数指针作为参数提供了极大的灵活性,使得程序设计更加模块化和高效。无论是基本的应用还是高级特性(比如动态加载库),都可以借助这一技术轻松实现复杂逻辑处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值