解析Linux中多线程Android编程并传递多个参数实例

移动开发 Android
本文介绍的是解析Linux中多线程编程并传递多个参数实例,一个简单的实例为大家分享一下。

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

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

pthread.c  
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <string.h> 
struct argument  
{  
    int num;  
    char string[30];  
};  
int main()  
{  
    int i,ret;  
    void *thread1_func(void *);  
    void *thread2_func(void *);  
    void *thread_return1,*thread_return2;/*用来接收两个线程退出后的返回值*/  
    pthread_t thread1,thread2;  
    struct argument arg1,arg2;  
    arg1.num=1949;  
    strcpy(arg1.string,"中华人民共和国成立");  
    arg2.num=2009;  
    strcpy(arg2.string,"建国六十周年");  
    pthread_create(&thread1,NULL,thread1_func,(void *)&arg1);  
    pthread_create(&thread2,NULL,thread2_func,(void *)&arg2);  
    for(i=0;i<=2;i++)  
    {  
        printf("我是最初的进程!\n");  
        sleep(2);  
    }  
    ret=pthread_join(thread1,&thread_return1);/*等待第一个线程退出,并接收它的返回值*/  
    if(ret!=0)  
        printf("调用pthread_join获取线程1返回值出现错误!\n");  
    else  
        printf("pthread_join调用成功!线程1退出后带回的值是%d\n",(int)thread_return1);  
    ret=pthread_join(thread2,&thread_return2);/*等待第二个线程退出,并接收它的返回值*/  
    if(ret!=0)  
        printf("调用pthread_join获取线程2返回值出现错误!\n");  
    else  
        printf("pthread_join调用成功!线程2退出后带回的值是%d\n",(int)thread_return2);  
    return 0;  
}  
void *thread1_func(void *arg)  
{  
    int i;  
    struct argument *arg_thread1;/*这里定义了一个指向argument类型结构体的指针arg_thread1,用它来接收传过来的参数的地址*/  
    arg_thread1=(struct argument *)arg;  
    for(i=0;i<=3;i++)  
    {  
        printf("我来自线程1,传递给我的参数是%d,%s。\n",(*arg_thread1).num,(*arg_thread1).string);  
        sleep(2);  
    }  
    return (void *)123;  
}  
void *thread2_func(void *arg)  
{  
    int i;  
    struct argument arg_thread2;/*这里定义了一个argument类型的结构体arg_thread2,用来接收传过来的指针参数指向的值。
                                                                                  这种方法和thread1_func函数中的方法都是可行的*/  
    arg_thread2=*(struct argument *)arg;      
    for(i=0;i<=3;i++)  
    {  
        printf("我来自线程2,传递给我的参数是%d,%s。\n",arg_thread2.num,arg_thread2.string);  
        sleep(2);  
    }  
    return (void *)456;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 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文件如下

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

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

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

以上是 Android.mk 的内容

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

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

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-30 17:31:32

Qt 多线程 信号

2011-06-22 16:18:23

QT 多线程 QSocket

2011-06-13 10:03:19

Qt 多线程 编程

2013-07-16 10:12:14

iOS多线程多线程概念多线程入门

2023-06-13 13:39:00

多线程异步编程

2011-06-02 17:27:49

iphone 多线程

2017-03-08 14:18:37

Linux多线程编程

2009-03-12 10:52:43

Java线程多线程

2023-05-12 14:14:00

Java线程中断

2024-03-27 08:47:10

Python多线程Threading

2024-10-21 16:59:37

C#编程多线程

2011-06-20 13:43:08

Qt Socket 线程

2010-03-15 17:56:23

Java多线程

2024-03-27 09:01:53

微服务FeignToken

2009-12-08 12:14:43

2023-04-02 17:53:10

多线程编程自测

2023-06-06 08:17:52

多线程编程Thread类

2023-06-05 07:56:10

线程分配处理器

2013-12-02 17:33:20

Linux进程多线程

2023-06-07 13:49:00

多线程编程C#
点赞
收藏

51CTO技术栈公众号