/*线程一*/
static void* thread_1(void*)
{
int i=0;
for(i=0;i<=6;i++)
{
LOGI("This is a pthread_1");
if(i==2)
pthread_exit(0);
//sleep(1);
}
}
/*线程二*/
static void* thread_2(void*)
{
int i;
for(i=0;i<3;i++)
LOGI("This is a pthread_2");
pthread_exit(0);
}
static jint JNICALL Add(JNIEnv *env, jobject jobj, jint x, jint y){
pthread_t id_1,id_2;
int i,ret;
//创建线程一
ret=pthread_create(&id_1,NULL,thread_1,NULL);
if(ret!=0)
{
LOGI("Create pthread error!");
return -1;
}
//创建线程二
ret=pthread_create(&id_2,NULL,thread_2,NULL);
if(ret!=0)
{
LOGI("Create pthread error!");
return -1;
}
//等待线程结束
pthread_join(id_1,NULL);
pthread_join(id_2,NULL);
return 0;
return x+y;
}
参考一:
pthread_join一般是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次join所有它创建的子线程。
pthread_exit一般是子线程调用,用来结束当前线程。
子线程可以通过pthread_exit传递一个返回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是正常还是异常。
pthread_detach(pthread_self());可以使得当前线程与父线程分离,当调用pthread_exit时,当前线程的资源便会释放,如果,不调用,便一直会等到父线程结束,当前线程的资源才会释放
phthread_t tid;
pthread_detach(&tid);在父线程中调用,使得线程可分离
参考二:
在任何一个时间点上,线程是
可结合的
(joinable)或者是
分离的
(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该要么被显示地回收,即调用pthread_join;要么通过调用pthread_detach函数被分离。
[cpp]
int pthread_join(pthread_t tid, void**thread_return);
若成功则返回0,若出错则为非零。
int pthread_join(pthread_t tid, void**thread_return);
若成功则返回0,若出错则为非零。 线程通过调用pthread_join函数等待其他线程终止。pthread_join函数分阻塞,直到线程tid终止,将线程例程返回的(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有存储器资源。[cpp] view plaincopyprint?int pthread_detach(pthread_t tid);
若成功则返回0,若出错则为非零。
int pthread_detach(pthread_t tid);
若成功则返回0,若出错则为非零。
pthread_detach用于分离可结合线程tid。线程能够通过以pthread_self()为参数的pthread_detach调用来分离它们自己。
如果一个可结合线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。
由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的连接请求),这时可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(thread_id)(非阻塞,可立即返回)
这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。
参考三:互斥锁的初始化
在Linux下, 线程的互斥量数据类型是pthread_mutex_t.
在使用前, 要对它进行初始化:(两种方式)
(1)静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER.
(2)动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化,
并且在释放内存(free)前需要调用pthread_mutex_destroy.(注如果一个线程已经获取pthread_mutex_t,这时在另一个线程中调用pthread_mutex_destroy会出错)