當前位置:首頁 » 操作系統 » linux創建線程

linux創建線程

發布時間: 2022-08-03 22:08:35

A. linux c如何創建線程池

linux c 並沒有自帶的線程池,純C的線程池很少

1:使用glib的線程池,gthreadpool,這個是linux C 下面的一個線程池實現,可以用於生產環境。
2:自己設計線程池,但是設計一個工業強度的線程池是一件非常復雜的事情,尤其用C來實現。一般思路就是建立一個線程池管理函數,一個線程函數並創建一組線程,一個全局的線程狀態數組,線程管理函數通過全局線程狀態數組來分派任務,線程函數更改自己的線程狀態來上報自己的運行情況,實現起來還是相當復雜的。
建議不要重復造輪子,直接使用現有的線程池實現,glib是很好的選擇。

B. linux線程可以創建線程嗎

創建線程一般都是在主線程裡面創建,因為在主線程裡面能夠對線程進行管理控制,而且還有很重要的一點,就是Linux編程中使用線程的好處是可以共享變數,這在主線程的main函數裡面更加方便,所以沒有在線程中再創建線程的用法。既然想在線程中再創建線程,為何不用fork復制進程呢,Linux的進程開銷是非常小的。

C. 在linux編為什麼要創建線程

也可以不用創建線程啊
如果你的程序單個進程可以完成需求,那麼就不用創建線程。
當你的需求需要多個任務進行協同處理時,那麼需要你創建多個線程或者進程來進行處理。

舉個簡單的例子,如果公路上有很多車,你現在是一車道,那麼你有1倆車,這條公路就能滿足現在的需求。
但是如果你現在又1W輛車,那麼你需要4車道或者8車道來運行,才能滿足1W輛車的需求。

D. linux線程裡面創建線程可以嗎

gcc xxx.c -lpthread 其中的-l是指包含的lib庫,具體寫法可以man gcc看下
多線程函數除了要包含頭文件pthread.h外還必須要包含lib庫pthread
pthread_create是創建線程,但具體的線程裡面做什麼事是在void *create(void *arg)里,這個函數名是自己任意區的,但返回值和參數一般都是void*類型,因為pthread_create函數的定義就是這樣
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

E. linux下main()中新建一個線程,延時問題

你對sleep可能有些誤解,sleep本身就是使進程睡眠,睡眠的線程不會去佔用CPU的。對於一個正在運行的線程來說,他最主要佔用的資源就是CPU運行時間和內存。既然SLEEP使其放棄對CPU的進程許可權(意思是這段時間內,他不會到CPU執行,如果想了解原因和具體實現可以參考linux內核代碼對sleep的實現),那你不想讓他佔用資源意思就是說:不想讓它占內存嘍??
從定義角度來說,線程不擁有內存資源(從內核中可以查到fork和vfork創建的都是線程,他們都不會新分配內存空間,而是和父進程共享內存空間),所以說你已經沒有什麼可以釋放了。如果還不明白,可以發信息給我。
或許你更希望做的是,壓根就不啟動這個線程,而是一個小時後啟動。因為你沒有辦法然main主線程1小時後啟動這個線程,因為你把握不好時間,那我可以建議你考慮下linux守護線程cron,這個可以達到你1小時後啟動的目的。

F. linux 驅動中,如何建立一個普通線程

gcc xxx.c -lpthread 其中的-l是指包含的lib庫,具體寫法可以man gcc看下 多線程函數除了要包含頭文件pthread.h外還必須要包含lib庫pthread pthread_create是創建線程,但具體的線程裡面做什麼事是在void *create(void *arg)里,這個函數名是自...

G. linux 在線程中可以在創建一個線程么

gcc
xxx.c
-lpthread
其中的-l是指包含的lib庫,具體寫法可以man
gcc看下
多線程函數除了要包含
頭文件
pthread.h外還必須要包含lib庫pthread
pthread_create
是創建線程,但具體的線程裡面做什麼事是在void
*create(void
*arg)里,這個函數名是自...

H. 有人能教下我有關linux裡面線程的知識嗎

.線程的基本介紹
(1)線程的概述
線程與進程類似,也允許應用程序並發執行多個任務的一種機制。一個進程可以包含多個線程,同一程序中的所有線程共享同一份全局內存區域,線程之間沒有真正意義的等級之分。同一個進程中的線程可以並發執行,如果處理器是多核的話線程也可以並行執行,如果一個線程因為等待I/O操作而阻塞,那麼其他線程依然可以繼續運行
(2)線程優於進程的方面

argv,environ

主線程棧
線程3的棧
線程2的棧
線程1的棧
共享函數庫共享的內存

未初始化的數據段
初始化數據段
文本
.進程間的信息難以共享。由於除去只讀代碼段外,父子進程並未共享內存,因此必須採用一些進程間通訊,在進程之間交換信息
.調用fork()來創建進程代價相對較高
線程很好的解決了上述倆個問題
.線程之間能夠方便,快速的共享信息,只需將數據復制到共享(全局或堆)變數中即可
.創建線程比創建線程通常要快10甚至更多,線程創建之所以快,是因為fork創建進程時所需復制多個屬性,而在線程中,這些屬性是共享的。
(3)創建線程
啟動程序時,產生的進程只有單條線程,我們稱之為主線程
#include<pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start)(void *),void *arg);12

新線程通過調用帶有arg的函數開始執行,調用pthread_create()的線程會繼續執行該調用之後的語句。
(4)終止線程
可以以如下方式終止線程的運行
.線程調用pthread_exit()
.線程start函數執行return語句並返回指定值
.調用pthread_cancel()取消線程
.任意線程調用了exit(),或者主線程執行了return語句,都會導致進程中的所有線程立即終止
pthread_exit()函數可以終止線程,且其返回值可由另一線程通過調用pthread_join()獲得
#include<pthread.h>void pthread_exit(void *retval);12

調用pthread_exit()相當於在線程的start函數中執行return,不同之處在於,pthread_exit()可以在任何地方調用,參數retval指定了線程的返回值
(5)獲取線程ID
#include<pthread.h>pthread_t pthread_self(void);12

線程ID在應用程序中主要有如下用途
.不同的pthreads函數利用線程ID來標識要操作目標線程。
.在具體的應用程序中,以特定線程的線程ID作為動態數據結構的標簽,這頗有用處,既可用來識別某個數據結構的創建者或屬主線程,又可確定隨後對該數據結構執行操作的具體線程
函數pthread_equal()可檢查倆個線程的ID是否相同
#include<pthread.h>int pthread_equal(pthread_t t1,pthread_t t2);//如果相同返回非0值,否則返回0123

(6)連接已終止的線程
函數pthread_join()等待由thread表識的線程終止
#include<pthread.h>int pthread_join(pthread_t thread,void **retval);//返回0調用成功,否則失敗123

如果pthread_join()傳入一個之前已然連接過的線程ID,將會導致無法預知的行為,當相同線程ID在參與一次連接後恰好為另一新建線程所重用,再度連接的可能就是這個新線程
若線程未分離,則就應該使用pthread_join()來連接線程,否則會產生僵屍線程
pthrea_join()函數的要點
.線程之間的關系是對等的,所以任意線程都可以調用pthread_join()來連接其他線程
.pthread_join()無法針對任意線程,只能連接單個線程
(6)線程的分離
默認情況下線程都是可連接的,但有時候,我們並不關心線程退出的狀態,我們可以調用pthread_detach()並向thread參數傳入指定線程的的標識符,將該線程標記為處於分離狀態
#include<pthread.h>int pthread_detach(pthread_t thread);//返回0成功,否則失敗123

一旦線程處於分離狀態,就不能在使用pthread_join()來獲取其狀態,也無法使其重返可連接狀態
(7)在應用程序中如何來選擇進程還是線程
.線程之間共享數據很簡單,進程間的數據共享需要更多的投入
.創建線程要比創建進程塊很多
.多線程編程時,需要確保調用線程安全的函數
.某個線程中的bug可能會危害進程中所有線程
.每個線程都在徵用宿主進程中有限的虛擬地址空間
.在多線程應用中,需要小心使用信號
.除了數據,線程還可以共享文件描述符,信號處置,當前工作目錄,以及用戶ID和組ID
線程的同步
(1)保護共享變數訪問:互斥量
線程的主要優勢在於能夠通過全局變數來共享信息,不過這種共享是有代價的。必須確保多個線程修改同一變數時,不會有其他線程也正在修改此變數,為避免線程更新時共享變數時所出現的問題,必須使用互斥量來確保同時僅有一個線程可以訪問某項共享資源
(2)靜態分配的互斥鎖
互斥鎖既可以像靜態變數那樣分配,也可以在運行時動態分配,互斥量屬於pthread_mutex_t類型的變數,在使用之前必須對其初始化。對於靜態分配的互斥量而言,可如下例所示,將PTHREAD_MUTEX_INITIALIZER賦給互斥量
pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;1

1.加鎖和解鎖互斥量
初始化之後,互斥量處於未鎖定狀態。函數pthread_mutex_lock()可以鎖定某一互斥量
而函數pthread_mutex_unlock()則可以將一個互斥量解鎖
#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);//返回0成功,其他失敗1234

要鎖定互斥量,在調用pthread_mutex_lock()時需要指定互斥量,如果互斥量當前處於未鎖定狀態,則該調用將會立即返回,如果該互斥量已被其他線程鎖定,那麼該調用將會阻塞,直至互斥量被解鎖
函數pthread_mutex_unlock()將解鎖之前已遭調用線程鎖定的互斥量
2.互斥量的性能
通常情況下,線程會花費更多的時間去做其他工作,對互斥量的加鎖解鎖相對要少的多,因此使用互斥量對大部分程序來說性能並無顯著的影響
3.互斥量的死鎖
當一個線程需要同時訪問多個共享資源時,沒個資源由不同的互斥索管理。當超過一個線程加鎖同一組互斥量時,就有可能發生死鎖。如下圖所示
線程A
1.pthread_mutex_lock(mutex1);
2.pthread_mutex_lock(mutex2);
線程2
1.pthread_mutex_lock(mutex2);
2.pthread_mutex_lock(mutex1);
每個線程都成功的鎖住一個互斥量,接著試圖對以為另一線程鎖定的互斥量加鎖,就會一直等下去
要避免此類死鎖問題,最簡單的就是定義互斥量的層級關系

I. linux內核創建內核線程有哪些方法

1.頭文件
#include <linux/sched.h> //wake_up_process()
#include <linux/kthread.h> //kthread_create()、kthread_run()
#include <err.h> //IS_ERR()、PTR_ERR()
2.實現
2.1創建線程
在模塊初始化時,可以進行線程的創建。使用下面的函數和宏定義:
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
const char namefmt[], ...);
#define kthread_run(threadfn, data, namefmt, ...) \
({ \
struct task_struct *__k \
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
if (!IS_ERR(__k)) \
wake_up_process(__k); \
__k; \
})
例如:
static struct task_struct *test_task;
static int test_init_mole(void)
{
int err;
test_task = kthread_create(test_thread, NULL, "test_task");
if(IS_ERR(test_task)){
printk("Unable to start kernel thread. ");
err = PTR_ERR(test_task);
test_task = NULL;
return err;
}
wake_up_process(test_task);
return 0;
}
mole_init(test_init_mole);
2.2線程函數
在線程函數里,完成所需的業務邏輯工作。主要框架如下所示:
int threadfunc(void *data){

while(1){
set_current_state(TASK_UNINTERRUPTIBLE);
if(kthread_should_stop()) break;
if(){//條件為真
//進行業務處理
}
else{//條件為假
//讓出CPU運行其他線程,並在指定的時間內重新被調度
schele_timeout(HZ);
}
}

return 0;
}
2.3結束線程
在模塊卸載時,可以結束線程的運行。使用下面的函數:
int kthread_stop(struct task_struct *k);
例如:
static void test_cleanup_mole(void)
{
if(test_task){
kthread_stop(test_task);
test_task = NULL;
}
}
mole_exit(test_cleanup_mole);
3.注意事項
(1) 在調用kthread_stop函數時,線程函數不能已經運行結束。否則,kthread_stop函數會一直進行等待。
(2) 線程函數必須能讓出CPU,以便能運行其他線程。同時線程函數也必須能重新被調度運行。在例子程序中,這是通過schele_timeout()函數完成的。
4.性能測試
可以使用top命令來查看線程(包括內核線程)的CPU利用率。命令如下:
top –p 線程號
可以使用下面命令來查找線程號:
ps aux|grep 線程名
可以用下面的命令顯示所有內核線程:
ps afx
註:線程名由kthread_create函數的第三個參數指定

在分析usb_hub_init()的代碼的時候,忽略掉了一部份.
代碼片段如下所示:
int usb_hub_init(void)
{
……
khubd_task = kthread_run(hub_thread, NULL, "khubd");
……
}
Kthread_run() 是kernel中用來啟動一個新kernel線程的介面,它所要執行的函數就是後面跟的第一個參數.在這里,也就是hub_thread().另外,順帶 提一句,要終止kthread_run()創建的線程,可以調用kthread_stop().

J. linux 線程裡面創建線程嗎

1、windows里的進程/線程是繼承自OS/2的。在windows里,"進程"是指一個程序,而"線程"是一個"進程"里的一個執行"線索"。從核心上講,windows的多進程與Linux並無多大的區別,在windows里的線程才相當於Linux的進程,是一個實際正在執行的代碼。但是,windows里同一個進程里各個線程之間是共享數據段的。這才是與Linux的進程最大的不同。2、在windows下,使用CreateThread函數創建線程,與Linux下創建進程同,windows線程不是從創建處開始運行的,而是由CreateThread指定一個函數,線程就從那個函數處開始運行。此程序同前面的UNIX程序一樣,由兩個線程各列印1000條信息。threadID是子線程的線程號,另外,全局變數g是子線程與父線程共享的,這就是與Linux最大的不同之處。大家可以看出,windows的進程/線程要比Linux復雜,在Linux要實現類似windows的線程並不難,只要fork以後,讓子進程調用ThreadProc函數,並且為全局變數開設共享數據區就行了,但在windows下就無法實現類似fork的功能了。所以現在windows下的C語言編譯器所提供的庫函數雖然已經能兼容大多數Linux/UNIX的庫函數,但卻仍無法實現fork。3、對於多任務系統,共享數據區是必要的,但也是一個容易引起混亂的問題,windows下,一個程序員很容易忘記線程之間的數據是共享的這一情況,一個線程修改過一個變數後,另一個線程卻又修改了它,結果引起程序出問題。但在Linux下,由於變數本來並不共享,而由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。

熱點內容
python代碼保護 發布:2025-01-17 14:02:22 瀏覽:323
王者榮耀電腦如何改戰區安卓 發布:2025-01-17 13:23:18 瀏覽:814
華為手機如何開啟說出密碼 發布:2025-01-17 13:23:12 瀏覽:101
伺服器在美國說明什麼 發布:2025-01-17 13:14:10 瀏覽:11
啟辰t90有哪些配置 發布:2025-01-17 13:05:40 瀏覽:38
手機微博密碼怎麼改密碼忘了怎麼辦 發布:2025-01-17 13:04:44 瀏覽:959
微笑雲伺服器 發布:2025-01-17 13:03:25 瀏覽:83
android頂部標題欄 發布:2025-01-17 13:02:28 瀏覽:692
androidjs傳遞參數 發布:2025-01-17 12:51:54 瀏覽:477
建築大師輔助腳本 發布:2025-01-17 12:47:33 瀏覽:331