解析Linux中多线程Android编程并传递多个参数实例
创始人
2024-08-02 05:50:22
0次

Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容。今天上午实验了Linux下的多线程编程,并将多个参数传递给线程要执行的函数。在Linux环境下编译通过后,还将它移到了Android的模拟器中。

以下是实验程序的源代码:

  1. pthread.c  
  2. #include  
  3. #include  
  4. #include  
  5. #include  
  6. #include  
  7. struct argument  
  8. {  
  9.     int num;  
  10.     char string[30];  
  11. };  
  12. int main()  
  13. {  
  14.     int i,ret;  
  15.     void *thread1_func(void *);  
  16.     void *thread2_func(void *);  
  17.     void *thread_return1,*thread_return2;/*用来接收两个线程退出后的返回值*/  
  18.     pthread_t thread1,thread2;  
  19.     struct argument arg1,arg2;  
  20.     arg1.num=1949;  
  21.     strcpy(arg1.string,"中华人民共和国成立");  
  22.     arg2.num=2009;  
  23.     strcpy(arg2.string,"建国六十周年");  
  24.     pthread_create(&thread1,NULL,thread1_func,(void *)&arg1);  
  25.     pthread_create(&thread2,NULL,thread2_func,(void *)&arg2);  
  26.     for(i=0;i<=2;i++)  
  27.     {  
  28.         printf("我是最初的进程!\n");  
  29.         sleep(2);  
  30.     }  
  31.     ret=pthread_join(thread1,&thread_return1);/*等待第一个线程退出,并接收它的返回值*/  
  32.     if(ret!=0)  
  33.         printf("调用pthread_join获取线程1返回值出现错误!\n");  
  34.     else  
  35.         printf("pthread_join调用成功!线程1退出后带回的值是%d\n",(int)thread_return1);  
  36.     ret=pthread_join(thread2,&thread_return2);/*等待第二个线程退出,并接收它的返回值*/  
  37.     if(ret!=0)  
  38.         printf("调用pthread_join获取线程2返回值出现错误!\n");  
  39.     else  
  40.         printf("pthread_join调用成功!线程2退出后带回的值是%d\n",(int)thread_return2);  
  41.     return 0;  
  42. }  
  43. void *thread1_func(void *arg)  
  44. {  
  45.     int i;  
  46.     struct argument *arg_thread1;/*这里定义了一个指向argument类型结构体的指针arg_thread1,用它来接收传过来的参数的地址*/  
  47.     arg_thread1=(struct argument *)arg;  
  48.     for(i=0;i<=3;i++)  
  49.     {  
  50.         printf("我来自线程1,传递给我的参数是%d,%s。\n",(*arg_thread1).num,(*arg_thread1).string);  
  51.         sleep(2);  
  52.     }  
  53.     return (void *)123;  
  54. }  
  55. void *thread2_func(void *arg)  
  56. {  
  57.     int i;  
  58.     struct argument arg_thread2;/*这里定义了一个argument类型的结构体arg_thread2,用来接收传过来的指针参数指向的值。
  59. 这种方法和thread1_func函数中的方法都是可行的*/  
  60.     arg_thread2=*(struct argument *)arg;      
  61.     for(i=0;i<=3;i++)  
  62.     {  
  63.         printf("我来自线程2,传递给我的参数是%d,%s。\n",arg_thread2.num,arg_thread2.string);  
  64.         sleep(2);  
  65.     }  
  66.     return (void *)456;  
  67. } 

以上是 pthread.c 的内容

在Linux终端下用 gcc -o pthread -lpthread pthread.c 命令进行编译,注意应该加上-lpthread

./pthread 运行结果

我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我是最初的进程!
我来自线程2,传递给我的参数是2009,建国六十周年。
我是最初的进程!
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我是最初的进程!
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程2,传递给我的参数是2009,建国六十周年。
我来自线程1,传递给我的参数是1949,中华人民共和国成立。
pthread_join调用成功!线程1退出后带回的值是123
pthread_join调用成功!线程2退出后带回的值是456

可以从执行顺序看出,线程之间存在着竞争,并非是按照固定次序运行。

在这之后,将其移到Android模拟器中运行,编写Android.mk文件如下

  1. Android.mk   
  2. LOCAL_PATH:= $(call my-dir)  
  3. include $(CLEAR_VARS)  
  4. LOCAL_SRC_FILES:= \  
  5.     pthread.c  
  6. LOCAL_CFLAGS=  

#注意,这里一定要用LOCAL_LDLIBS的方式加载pthread库,不能使用“LOCAL_CFLAGS= -lpthread“或者”LOCAL_SHARED_LIBRARIES :=libpthread“或者"LOCAL_STATIC_LIBRARIES :=libpthread"的方式加载,否则会失败。

  1. LOCAL_LDLIBS += -lpthread  
  2. LOCAL_MODULE:= pthread 
  3. include $(BUILD_EXECUTABLE) 

以上是 Android.mk 的内容

编译执行,运行结果与在LINUX中类似。

小结:解析Linux中多线程编程并传递多个参数实例的内容介绍完了,希望本文对你有所帮助!

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...