1. 程式人生 > >Linux中pthread_detach()執行緒注意

Linux中pthread_detach()執行緒注意

一、建立分離執行緒

有兩種方式建立分離執行緒:

(1)線上程建立時將其屬性設為分離狀態(detached);

(2)線上程建立後將其屬性設為分離的(detached)。

二、分離執行緒的作用

由系統來回收執行緒所佔用資源。

三、例項

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <dirent.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <time.h>

void* thread1(void *arg)
{
    while (1)
    {
        usleep(100 * 1000);
        printf("thread1 running...!\n");
    }
    printf("Leave thread1!\n");

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t tid;

    pthread_create(&tid, NULL, (void*)thread1, NULL);
    pthread_detach(tid);  // 使執行緒處於分離狀態
    sleep(1);
    printf("Leave main thread!\n");
    pthread_exit("end"); //這個地方執行後,子程序並沒有退出
//    return 0; //return後,系統會呼叫_exit
,所有程序都會退出。
}

#gcc a.c -lpthread

#./a.out
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
Leave main thread!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!

可以看出main執行緒退出後,thread_1並沒有退出。

$ cat a.c
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <dirent.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <time.h>

void* thread1(void *arg)
{
    while (1)
    {
        usleep(100 * 1000);
        printf("thread1 running...!\n");
    }
    printf("Leave thread1!\n");

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t tid;

    pthread_create(&tid, NULL, (void*)thread1, NULL);
    pthread_detach(tid);  // 使執行緒處於分離狀態
    sleep(1);
    printf("Leave main thread!\n");
    return 0;
}

$ ./a.out
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
Leave main thread!

可以看出main執行緒return後,子執行緒也退出了。

如果把pthread_deteach改為pthread_join,因為子執行緒是while(1)所有主執行緒也不會退出。

[email protected]:~/work/mt8516-p1v2/build/tmp/deploy/images/aud8516p1v2-slc-bluez$ cat a.c
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <dirent.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <time.h>

void* thread1(void *arg)
{
    while (1)
    {
        usleep(100 * 1000);
        printf("thread1 running...!\n");
    }
    printf("Leave thread1!\n");

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t tid;

    pthread_create(&tid, NULL, (void*)thread1, NULL);
    //pthread_detach(tid);  // 使執行緒處於分離狀態
    pthread_join(tid,NULL);  // 使執行緒處於分離狀態
    sleep(1);
    printf("Leave main thread!\n");
    return 0;
}

[email protected]:~/work/mt8516-p1v2/build/tmp/deploy/images/aud8516p1v2-slc-bluez$ ./a.out
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!
thread1 running...!

^

這可以在main中使用pthread_cancel,明確退出子執行緒。

相關推薦

Linuxpthread_detach()執行注意

一、建立分離執行緒有兩種方式建立分離執行緒:(1)線上程建立時將其屬性設為分離狀態(detached);(2)線上程建立後將其屬性設為分離的(detached)。二、分離執行緒的作用由系統來回收執行緒所佔用資源。三、例項#include <stdlib.h>#in

Linuxepoll+執行池實現高併發

伺服器併發模型通常可分為單執行緒和多執行緒模型,這裡的執行緒通常是指“I/O執行緒”,即負責I/O操作,協調分配任務的“管理執行緒”,而實際的請求和任務通常交由所謂“工作者執行緒”處理。通常多執行緒模型下,每個執行緒既是I/O執行緒又是工作者執行緒。所以這裡討論的是,單I/O執行緒+多工作者執行緒的模型,這也

Linux執行區域性儲存

在Linux系統中使用C/C++進行多執行緒程式設計時,我們遇到最多的就是對同一變數的多執行緒讀寫問題,大多情況下遇到這類問題都是通過鎖機制來處理,但這對程式的效能帶來了很大的影響,當然對於那些系統原生支援原子操作的資料型別來說,我們可以使用原子操作來處理,這能

如何在linux設定執行的優先順序

在linux下我們可以通過 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg

每天進步一點點——Linux執行區域性儲存(二)

凡是帶有__thread的變數,每個執行緒都擁有該變數的一份拷貝,且互不干擾。執行緒區域性儲存中的變數將一直存在,直至執行緒終止,當執行緒終止時會自動釋放這一儲存。__thread並不是所有資料型別都可以使用的,因為其只支援POD(Plain old data structure)[1]型別,不支援clas

LInux利用執行實現多個客戶端和伺服器端進行通訊

上一篇博文講了如何利用子程序實現多個客戶端和伺服器端進行通訊, 那麼,這一篇部落格就來實現一下如何利用執行緒實現多個客戶端和伺服器端進行通訊 程式碼實現: ser1.c #include <

Linux 執行】同一個程序執行共享哪些資源

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.  執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧)

linux下一個程序執行的資源共享

在說執行緒資源共享之前,我們先來說來說一下執行緒的概念,執行緒是程序內部的一條執行序列(即執行流),一個程序至少有一個執行緒,即main函式代表的執行流。當然我們也可以通過執行緒庫來建立新的執行緒,這種執行緒我們稱之為函式執行緒,同一個程序中的所有普執行緒是併發執行的。而這些

Linux核心執行及多執行

一、執行緒的概念、理解及特點     1.執行緒的概念:         至今為止,Linux下還是沒有“真正的執行緒”。談到執行緒就不得不提到程序這概念,程序是系統中程式執行和資源分配的基本單位。每個程序都擁有自己的資料段,程式碼段和堆疊段,這就造成了程序在進行切換

Linux核心執行死鎖

一、死鎖的概念     1.什麼是死鎖:       死鎖 (deadlocks): 是指兩個或兩個以上的程序(執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的

linux 下檢視某一程序的cpu使用率和這個執行各個執行的cpu使用率

在Ubuntu/CentOS等linux系統中, 在除錯程式過程中,有時需要檢視程式的CPU的使用率和程式的各個程序的使用率. 那麼首先需要獲取這個程序的PID: ps -ef|grep [process name] 然後檢視該程序的CPU: top -p [PID]

linux java 查詢程序執行

這裡對linux下、sun(oracle) JDK的執行緒資源佔用問題的查詢步驟做一個小結; linux環境下,當發現java程序佔用CPU資源很高,且又要想更進一步查出哪一個java執行緒佔用了CPU資源時,按照以下步驟進行查詢: (一):通過【 top -p12377-

如何在linux/unix設定執行的優先順序

 在linux下我們可以通過int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);來建立執行緒,但是如何設定執行緒的優先順序呢?在討論這個問題

Linux/Unix程式設計執行安全問題

在目前的電腦科學中,執行緒是作業系統排程的最小單元,程序是資源分配的最小單元。在大多數作業系統中,一個程序可以同時派生出多個執行緒。這些執行緒獨立執行,共享程序的資源。在單處理器系統中,多執行緒通過分時複用技術來技術,處理器在不同的執行緒間切換,從而更高效地利用系統 CPU

Qt使用執行時的注意事項(執行沒起作用的原因)

今天偶然發現,執行程式時程式輸出視窗中有如下提示:  QObject::startTimer: Timers can only be used with threads started with QThread 也就是當物件有父物件時,是不可以移到其他執行緒當中去的。 程式

linux下多執行條件變數的用法

使用條件變數最大的好處是可以避免忙等。相當與多執行緒中的訊號。 條件變數是執行緒中的東西就是等待某一條件的發生和訊號一樣以下是說明,條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"條件變數的條件成立"而掛起;另一個執行緒

OC執行的使用、概念、建立方式、生命週期、使用注意

     程序 什麼是程序:在我們的系統中正在執行的程式 程序的作用:負責給應用程式分配記憶體空間(該空間是受保護的,獨立的) 執行緒 什麼是執行緒:執行緒是CPU排程的最小單元,由CPU排程 執行緒的作用:負責執行應用程式中的程式碼,在系統中執行著的程式的程式碼只能由執

top、ps命令檢視程序執行方法

方法一:PS ps -a顯示所有程序pid,“-T”選項可以開啟執行緒檢視。 eg: ps -aT 顯示所有執行緒 方法二: Top top用於實時檢視各個執行緒情況,用top命令的“-H”選項,該選項會列出所有Linux執行緒。 eg1. top -H 所有執行緒 eg2.

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Spring 執行安全性

Spring與執行緒安全   Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。   Spring對每個bean提供了一個s