導航:首頁 > 編程系統 > clinux線程

clinux線程

發布時間:2023-10-22 08:40:09

1. 在linux下用C++創建新線程

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void* thread(void* arg)
{
printf ("The child process...\n");
}

int main(int argc, char *argv[])
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *)thread,NULL);
if(ret!=0)
{
printf ("Create pthread error!\n");
exit (1);
}

}
程序如上就可以編譯。
它屬於linux下C編程中多線程編程的范圍。
用命令
gcc -lpthread 1.c -o 1
./1
就可以出結果。
多線程編程的基礎可以參考
http://hi..com/huifeng00/blog/item/ed13ddc0d6c59c170ff47715.html

2. linux下 c中怎麼讓才能安全關閉線程

多線程程序中,特別是頻繁申請,釋放線程的情況下,就要注意線程的關閉,最好使用線程池。
一,線程退出方式
(1) 執行完成後隱式退出;
(2) 由線程本身顯示調用pthread_exit 函數退出;
pthread_exit (void * retval) ;
(3) 被其他線程用pthread_cance函數終止:
pthread_cance (pthread_t thread) ;
二,線程狀態
pthread 線程有兩種狀態,joinable(非分離)狀態和detachable(分離)狀態,默認為joinable。
joinable:當線程函數自己返回退出或pthread_exit時都不會釋放線程所用資源,包括棧,線程描述符等(有人說有8k多,未經驗證)。
detachable:線程結束時會自動釋放資源。
joinable 線程執行完後不使用pthread_join的話就會造成內存泄漏。
解決辦法:
1、創建線程前設置 PTHREAD_CREATE_DETACHED 屬性
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);
pthread_attr_destroy (&attr);
2、當線程為joinable時,使用pthread_join來獲取線程返回值,並釋放資源。
3、當線程為joinable時,也可在線程中調用 pthread_detach(pthread_self());來分離自己。

3. linux下C語言編程線程有什麼好處呢

子函數只是在主函數裡面順序進行的,但是線程是並發進行的。當兩個線程需要使內用同一個資源時還需容要設置互斥信號燈,防止兩個線程對資源的訪問發生沖突。

以上是一個方面,另一個方面是多線程比較結合實際。不知道你們做過火車的購票模擬沒有,當時我們做過,一次用線程實現的,一次用進程實現的。其目的就是使多個操作看起來像是並發的在執行(實際上CPU是不會同時做多個工作的)

4. Linux c如何創建線程池

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

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

5. linux下C編程問題,線程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 線程的個數 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long還長的整數 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放線程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在這里填寫代碼,用pthread_create建一個普通的線程,
線程id存入pthread_id[i],線程執行函數是thread_worker
並i作為參數傳遞給線程 */
pthread_create(&pthread_id[i],NULL,thread_worker,(void*)i }
do {/* 用戶按一次回車執行下面的循環體一次。按q退出 */
unsigned long long sum = 0;
/* 求所有線程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}

printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');

return 0;
}

void* thread_worker(void* p)
{
int thread_num;
/* 在這里填寫代碼,把main中的i的值傳遞給thread_num */
thread_num = (int)p;
for(;;)
{
/* 無限循環 */
counter[thread_num]++; /* 本線程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}

6. linux C下多線程接收數據怎麼進行存儲再統一處理

在Linux系統中使用C/C++進行多線程編程時,我們遇到最多的就是對同一變數的多線程讀寫問題,大多情況下遇到這類問題都是通過鎖機制來處理,但這對程序的性能帶來了很大的影響,當然對於那些系統原生支持原子操作的數據類型來說,我們可以使用原子操作來處理,這能對程序的性能會得到一定的提高。那麼對於那些系統不支持原子操作的自定義數據類型,在不使用鎖的情況下如何做到線程安全呢?本文將從線程局部存儲方面,簡單講解處理這一類線程安全問題的方法。

一、數據類型
在C/C++程序中常存在全局變數、函數內定義的靜態變數以及局部變數,對於局部變數來說,其不存在線程安全問題,因此不在本文討論的范圍之內。全局變數和函數內定義的靜態變數,是同一進程中各個線程都可以訪問的共享變數,因此它們存在多線程讀寫問題。在一個線程中修改了變數中的內容,其他線程都能感知並且能讀取已更改過的內容,這對數據交換來說是非常快捷的,但是由於多線程的存在,對於同一個變數可能存在兩個或兩個以上的線程同時修改變數所在的內存內容,同時又存在多個線程在變數在修改的時去讀取該內存值,如果沒有使用相應的同步機制來保護該內存的話,那麼所讀取到的數據將是不可預知的,甚至可能導致程序崩潰。
如果需要在一個線程內部的各個函數調用都能訪問、但其它線程不能訪問的變數,這就需要新的機制來實現,我們稱之為Static memory local to a thread (線程局部靜態變數),同時也可稱之為線程特有數據(TSD: Thread-Specific Data)或者線程局部存儲(TLS: Thread-Local Storage)。這一類型的數據,在程序中每個線程都會分別維護一份變數的副本(),並且長期存在於該線程中,對此類變數的操作不影響其他線程。如下圖:

二、一次性初始化
在講解線程特有數據之前,先讓我們來了解一下一次性初始化。多線程程序有時有這樣的需求:不管創建多少個線程,有些數據的初始化只能發生一次。列如:在C++程序中某個類在整個進程的生命周期內只能存在一個實例對象,在多線程的情況下,為了能讓該對象能夠安全的初始化,一次性初始化機制就顯得尤為重要了。——在設計模式中這種實現常常被稱之為單例模式(Singleton)。Linux中提供了如下函數來實現一次性初始化:
#include <pthread.h>

// Returns 0 on success, or a positive error number on error
int pthread_once (pthread_once_t *once_control, void (*init) (void));
利用參數once_control的狀態,函數pthread_once()可以確保無論有多少個線程調用多少次該函數,也只會執行一次由init所指向的由調用者定義的函數。init所指向的函數沒有任何參數,形式如下:
void init (void)
{
// some variables initializtion in here
}
另外,參數once_control必須是pthread_once_t類型變數的指針,指向初始化為PTHRAD_ONCE_INIT的靜態變數。在C++0x以後提供了類似功能的函數std::call_once (),用法與該函數類似。使用實例請參考https://github.com/ApusApp/Swift/blob/master/swift/base/singleton.hpp實現。

閱讀全文

與clinux線程相關的資料

熱點內容
好看的qq密碼 瀏覽:293
安卓唯一標識有哪些 瀏覽:243
win10ime 瀏覽:271
手機號大數據保護停機是什麼意思 瀏覽:81
兩個蘋果手機怎麼隔空投送app 瀏覽:903
ps修改有褶皺的文件 瀏覽:417
javadbfreader 瀏覽:307
蘋果手機數字代碼是什麼 瀏覽:66
驅動程序順序安裝腳本 瀏覽:665
word文件里怎樣查重 瀏覽:219
mx5系統基帶版本 瀏覽:184
ntlea全域通win10 瀏覽:171
qq怎麼查看別人的收藏 瀏覽:135
地震三參數matlab程序 瀏覽:57
怎樣給優盤文件加密軟體 瀏覽:7
收拾文件有哪些小妙招 瀏覽:431
pdf文件去底網 瀏覽:253
win10重裝系統需要格式化c盤嗎 瀏覽:424
路由器trx文件 瀏覽:655
淘寶店鋪數據包怎麼做 瀏覽:195

友情鏈接