多线程,多进程,求1-1000,0000数值的和,有callback返回值操作

# 1.自己动手计算1 + 2 + 3 + ….+ 1000 0000, 单线程计算, 多线程, 多进程, 并比较结果

import time
from functools import wraps
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

y = 0
Ret = 0


# 装饰器用于计量时间
def count_time(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        s = time.perf_counter()
        start = time.process_time()
        r = func(*args, **kwargs)
        end = time.process_time()
        e = time.perf_counter()
        print('%s总共耗时:%s,cpu耗时:%s' % (func.__name__, e - s, end - start))
        return r

    return wrapper


# 求和, 从start+ start+1...end
def sum_from_a_b(start, end):
    ret = 0
    for i in range(start, end + 1):
        ret += i
    return ret


# 多进程版本的
@count_time
def OneThread():
    ret = sum_from_a_b(0, 10000000)
    return ret


def func_save(x):
    global y
    y += x
    print(y)


@count_time
def multi_thread():
    for i in range(10):
        # 线程池 提交任务
        thread_pools.apply_async(sum_from_a_b, args=(i * 1000000 + 1, (i + 1) * 1000000), callback=func_save)
        #callback:把执行的返回值作为参数传入callback函数
    thread_pools.close()
    thread_pools.join()


def func_save_process(x):
    global Ret
    Ret += x
    print(Ret)


@count_time
def multi_process():
    for i in range(10):
        process_pool.apply_async(sum_from_a_b, args=(i * 1000000 + 1, (i + 1) * 1000000), callback=func_save_process)
    process_pool.close()
    process_pool.join()


if __name__ == "__main__":
    thread_pools = ThreadPool()
    process_pool = Pool(10)
    ret = OneThread()
    multi_process()
    multi_thread()
    print('*' * 10)
    print(ret)
    print(y)
    print(Ret)

 

<think>好的,用户现在问的是_system_property_find的返回值。首先,我需要确认这个函数是哪个环境或系统中的,因为不同的系统可能有不同的实现。根据常见的知识,这个函数看起来像是Android系统中的一个API,属于libcutils或者类似的库,用于访问系统属性。 用户之前问过faccessat的返回值,现在可能是在继续学习系统调用或底层API,所以需要保持回答的结构之前一致,确保用户容易理解。接下来需要回忆_system_property_found的文档或源码,确定其返回值类型可能的情况。 首先,查找相关资料:在Android开发中,系统属性是通过类似property_get、property_set等函数来操作的,而_system_property_find可能用于查找某个属性的句柄。返回值可能是一个指向prop_info结构的指针,如果找不到则返回NULL。 接下来需要确定返回值的具体含义。正确的返回值是指针,NULL表示失败。然后考虑用户可能的错误处理,比如检查返回值是否为NULL,并处理错误情况。同时,可能需要说明多线程环境下的注意事项,因为系统属性可能在查询时被修改。 用户可能需要知道如何正确使用这个函数,以及返回值在不同情况下的意义。比如,返回非NULL指针后,如何读取属性值,是否有其他函数如_system_property_read需要配合使用。此外,是否需要权限或者特定条件才能访问某些属性。 还需要注意线程安全,比如在Android中,系统属性的访问是否是线程安全的,是否需要加锁。另外,是否需要在使用后释放资源,或者prop_info结构是否需要特别处理。 可能用户在使用这个函数时遇到了问题,比如返回NULL,想知道可能的原因,比如属性不存在、权限不足或者名称错误。这时候需要列举常见的错误原因,帮助用户排查问题。 最后,确保回答的结构之前的faccessat一致,比如基本返回值规则、常见错误场景、使用示例、注意事项等,保持用户的学习连贯性。同时,检查是否有遗漏的要点,比如头文件需要包含,或者链接特定的库,这些也是用户可能需要的。</think>以下是关于Android系统API `_system_property_find` 返回值的详细说明: --- ### 一、基本返回值规则 1. **成功找到属性** 返回指向 `prop_info` 结构体的指针(非空地址),该指针用于后续属性操作: ```c const prop_info* prop = _system_property_find("ro.build.version"); if (prop != NULL) { // 找到属性,可继续操作 } ``` 2. **未找到属性** 返回 `NULL` 指针,表示以下情况之一: - 属性名称不存在 - 属性名称格式错误 - 权限不足(需`SELinux`策略允许) --- ### 二、典型使用场景 #### 场景1:属性读取 ```c const prop_info* prop = _system_property_find("persist.sys.timezone"); if (prop) { char value[PROP_VALUE_MAX]; __system_property_read(prop, NULL, value); // 通过指针读取值 LOG("时区配置:%s", value); } ``` #### 场景2:动态更新监控 ```c // 获取属性变更回调的上下文 void* callback(const prop_info* pi, void* cookie) { // 处理属性更新 return NULL; } const prop_info* prop = _system_property_find("net.dns1"); if (prop) { // 注册属性变更监听 __system_property_add_callback(prop, callback, NULL); } ``` --- ### 三、错误处理对照表 | 返回值 | 可能原因 | 调试方法 | |---------|----------------------------------|----------------------------------| | `NULL` | 1. 属性名拼写错误(如大小写敏感)<br>2. 属性未在`/system/build.prop`等文件中定义<br>3. 进程缺少`SELinux`权限(查看`avc: denied`日志) | 1. 使用`getprop <name>`验证属性存在性<br>2. 检查`dmesg`中的权限拒绝记录 | --- ### 四、参数与行为说明 | 参数要 | 细节 | |-----------------------|----------------------------------------------------------------------| | **属性名格式** | 需符合正则表达式:`^[a-zA-Z0-9._-]+$`,长度不超过`PROP_NAME_MAX`(32字节) | | **线程安全性** | 函数本身线程安全,但返回的`prop_info`指针在多线程环境下需同步访问 | | **内存管理** | 返回的指针为系统内部数据,无需手动释放 | --- ### 五、内核实现关联 在Android源码中,属性存储通过共享内存实现(`/dev/__properties__`),`_system_property_find` 的核心逻辑为: ```c // 代码原型(system/core/libcutils/properties.cpp) const prop_info* __system_property_find(const char* name) { return prop_area::find(name); } ``` 1. 通过哈希表快速定位属性名 2. 返回只读指针,指向属性值的共享内存区域 --- ### 六、调试建议 1. **ADB验证属性存在性** ```bash adb shell getprop ro.product.model ``` 2. **SELinux权限检查** 在拒绝访问时,查看内核日志: ```bash adb shell dmesg | grep "avc:.*{find}" ``` 3. **源码级调试** 在AOSP中通过`watchpoint`监控属性查找过程: ```gdb (gdb) watch -l *((const char**)prop_area::find) ``` --- > **注意**:此API属于Android内部实现(`libcutils`),非POSIX标准接口,在不同Android版本中行为可能变化(如Android 10后对属性访问的限制增强)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值