android8.1环境下 linux posix线程实现

Posted we1less

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android8.1环境下 linux posix线程实现相关的知识,希望对你有一定的参考价值。

写一个关于线程的消费者生产者的例子这里抛一个链接 是关于如何在jni环境下进行线程操作的https://blog.csdn.net/we1less/article/details/109133251

thread_posix.cpp

//
// Created by godv on 21-5-12.
//
#include <pthread.h>
#include <stdio.h>
#include "godv_log.h"
//队列的头文件
#include "queue"
//sleep的头文件
#include "unistd.h"

//消费者线程
pthread_t buy;
//消费者线程
pthread_t sell;

//线程锁
pthread_mutex_t mutex;
//线程信号
pthread_cond_t cond;

bool tag = true;

//创建队列
std::queue<int> queue;


void *buyCallBack(void *data) {
    void *data1 = data;
    while (tag) {
        //线程锁
        pthread_mutex_lock(&mutex);
        if (queue.size() > 0) {
            queue.pop();
            LOGD("消费者消费了一个产品,目前产品总数为:%lu", queue.size());
        } else {
            LOGD("消费者正在等待。。。");
            //线程等待  同时释放线程锁
            pthread_cond_wait(&cond, &mutex);
        }
        //线程解锁
        pthread_mutex_unlock(&mutex);
        usleep(1000 * 500);
    }
    pthread_exit(&buy);
}

void *sellCallBack(void *data) {
    void *data1 = data;
    while (tag) {
        //线程锁
        pthread_mutex_lock(&mutex);
        queue.push(1);
        LOGD("生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:%lu", queue.size());
        //发送信号激活等待的线程
        pthread_cond_signal(&cond);

        pthread_mutex_unlock(&mutex);
        usleep(500 * 1000);
    }
    pthread_exit(&sell);
}

int main(void){
    printf("thread start \\n");
    //初始化线程锁
    pthread_mutex_init(&mutex, NULL);
    //初始化线程信号
    pthread_cond_init(&cond, NULL);
    //创建线程  1NULL  线程属性   2NULL 为回调函数的参数
    pthread_create(&buy, NULL, buyCallBack, NULL);
    pthread_create(&sell, NULL, sellCallBack, NULL);

    sleep(10);

    tag = false;
    printf("thread end \\n");
    exit(0);
}

inc/godv_log.h 

//
// Created by godv on 21-5-12.
//

#ifndef android_GODV_LOG_H
#define ANDROID_GODV_LOG_H


#include "android/log.h"


#define LOG_TAG "godv"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#endif //ANDROID_GODV_LOG_H

Android.mk 

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := godv_thread

LOCAL_SRC_FILES := thread_posix.cpp

LOCAL_SHARED_LIBRARIES += liblog

LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc

include $(BUILD_EXECUTABLE)

log

generic_x86_64:/data/local # ./godv_thread                                     
thread start 
thread end 
generic_x86_64:/data/local # logcat -s "godv"
--------- beginning of main
--------- beginning of system
--------- beginning of crash
05-12 23:01:58.877  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:01:58.877  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:01:59.377  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:01:59.377  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:01:59.877  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:01:59.877  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:00.378  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:00.378  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:00.878  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:00.878  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:01.378  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:01.378  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:01.879  2347  2348 D godv    : 消费者正在等待。。。
05-12 23:02:01.879  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:02.379  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:02.379  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:02.879  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:02.879  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:03.380  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:03.380  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:03.880  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:03.880  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:04.380  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:04.380  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:04.881  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:04.881  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:05.381  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:05.381  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:05.881  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:05.881  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:06.382  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:06.382  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:06.882  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:06.882  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
05-12 23:02:07.382  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:07.382  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:07.883  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:2
05-12 23:02:07.883  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:1
05-12 23:02:08.383  2347  2348 D godv    : 消费者消费了一个产品,目前产品总数为:0
05-12 23:02:08.383  2347  2349 D godv    : 生产者生产了一个产品,并通知消费者可以消费了,目前产品总数为:1
^Z[1] + Stopped              \\logcat -s "godv" 

以上是关于android8.1环境下 linux posix线程实现的主要内容,如果未能解决你的问题,请参考以下文章

迭代器失效问题

android8.1 source build/envsetup.sh分析 增加删除lunch

Android系统 linux内核按键驱动开发

Android8.1源码编译实践(Mac)

android8.1启动过程 SystemServer 下

GMS认证-Android8.1新增cts测试(VTS下测试GSI版本)