掌握Android和Java线程原理上,阿里架构师深入讲解Android开发

本文深入探讨了Android开发中的线程原理,从原子性、可见性和顺序性三个方面阐述线程安全问题。文章介绍了pthread_create的实现,分析了线程安全问题的原因,并讨论了硬件指令如CAS和LL/SC在解决线程安全中的作用,为Android开发者提供了一套理解线程安全的全面视角。
摘要由CSDN通过智能技术生成

child_thread = nullptr;

// TODO: remove from thread group?

env->SetLongField(java_peer, WellKnownClasses::java_lang_Thread_nativePeer, 0);

{

std::string msg(child_jni_env_ext.get() == nullptr ?

StringPrintf(“Could not allocate JNI Env: %s”, error_msg.c_str()) :

StringPrintf(“pthread_create (%s stack) failed: %s”,

PrettySize(stack_size).c_str(), strerror(pthread_create_result)));

ScopedObjectAccess soa(env);

soa.Self()->ThrowOutOfMemoryError(msg.c_str());

}

}

CreateNativeThread函数通过调用pthread_create函数来创建线程。pthread_create的实现在Bionic目录的pthread_create对象中。Bionic是Android平台为了使用C/C++进行原生应用程序开发所有提供的POSIX标准C库,如果Bionic也有实现pthread_create兼容Android的线程创建。

/bionic/libc/bionic/pthread_create.cpp

int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr,

void* (start_routine)(void), void* arg) {

ErrnoRestorer errno_restorer;

// Inform the rest of the C library that at least one thread was created.

__isthreaded = 1;

pthread_attr_t thread_attr;

if (attr == NULL) {

pthread_attr_init(&thread_attr);

} else {

thread_attr = *attr;

attr = NULL; // Prevent misuse below.

}

pthread_internal_t* thread = NULL;

void* child_stack = NULL;

int result = __allocate_thread(&thread_attr, &thread, &child_stack);

if (result != 0) {

return result;

}

// Create a lock for the thread to wait on once it starts so we can keep

// it from doing anything until after we notify the debugger about it

//

// This also provides the memory barrier we need to ensure that all

// memory accesses previously performed by this thread are visible to

// the new thread.

thread->startup_handshake_lock.init(false);

thread->startup_handshake_lock.lock();

thread->start_routine = start_routine;

thread->start_routine_arg = arg;

thread->set_cached_pid(getpid());

int flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM |

CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID;

void* tls = reinterpret_cast<void*>(thread->tls);

#if defined(i386)

// On x86 (but not x86-64), CLONE_SETTLS takes a pointer to a struct user_desc rather than

// a pointer to the TLS itself.

user_desc tls_descriptor;

__init_user_desc(&tls_descriptor, false, tls);

tls = &tls_descriptor;

#endif

int rc = clone(__pthread_start, child_stack, flags, thread, &(thread->tid), tls, &(thread->tid));

if (rc == -1) {

int clone_errno = errno;

// We don’t have to unlock the mutex at all because clone(2) failed so there’s no child waiting to

// be unblocked, but we’re about to unmap the memory the mutex is stored in, so this serves as a

// reminder that you can’t rewrite this function to use a ScopedPthreadMutexLocker.

thread->startup_handshake_lock.unlock();

if (thread->mmap_size != 0) {

munmap(thread->attr.stack_base, thread->mmap_size);

}

__libc_format_log(ANDROID_LOG_WARN, “libc”, “pthread_create failed: clone failed: %s”, strerror(errno));

return clone_errno;

}

int init_errno = __init_thread(thread);

if (init_errno != 0) {

// Mark the thread detached and replace its start_routine with a no-op.

// Letting the thread run is the easiest way to clean up its resources.

atomic_store(&thread-&g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值