1樓:
執行一個程式,這個執行實體就是一個“程序”。
例如,用滑鼠雙擊ie瀏覽器的圖示,你執行了一個ie“程序”。第一個窗未關,你又用滑鼠雙擊ie瀏覽器的圖示,又出來一個瀏覽器的窗。這時,你執行了同一個程式的兩個程序。
對於自己寫的程式也如此。執行它,這個執行實體就是一個“程序”。同時執行兩個,就是兩個程序。計算機分別對兩個程序分配資源,直到程序結束,收回資源。
執行緒是程序裡真真跑的線路,真真執行的運算,每個程序有一個主執行緒。程序裡可以開第二第三條新的執行線路,gcc 用 pthread_create(),vc++ 用 createthread(), 這就叫雙執行緒和多執行緒。程序是執行緒的容器,同一程序的執行緒共享它們程序的資源。
執行緒裡建的執行緒就是父子執行緒。
兩個或多個程序協同工作時,需要互相交換資訊,有些情況下程序間交換的少量資訊,有些情況下程序間交換大批資訊。這就要通訊。通訊方式不止一種。
管道就是一種。vc++ 用 createpipe() 函式建立。
管道的實質是一個共享檔案,可藉助於檔案系統的機制實現,建立、開啟、關閉和讀寫.
一個程序正在使用某個管道寫入或讀出資料時,另一個程序就必須等待. 傳送者和接收者雙方必須知道對方是否存在,如果對方已經不存在,就沒有必要再傳送資訊.,傳送資訊和接收資訊之間要協調,當寫程序把一定數量的資料寫入管道,就去睡眠等待,直到讀程序取走資料後,把它喚醒。
vc++ 執行緒例子:
#include
#include
dword winapi fun1(lpvoid lp);
dword winapi fun2(lpvoid lp);
int piao=500;
int main()
dword winapi fun1(lpvoid lp)
return 0;
} ***********************************
建管道函式原形:
bool createpipe(
phandle hreadpipe, // read handle
phandle hwritepipe, // write handle
lpsecurity_attributes lppipeattributes, // security attributes
dword nsize // pipe size);
2樓:刀龍暗
先來看一個基本的例子:
複製內容到剪貼簿
**:#include
#include
using namespace std;
void* tprocess1(void* args)
return null;
}void* tprocess2(void* args)
return null;
}int main()在上面的例子中,我們首先加入了pthread.**件包含,這是所以pthread多執行緒程式所必須的,接著是iostream我們進行輸入輸出時要用到,接著就是兩個函式的定義,這和普通的函式沒有什麼區別,之所以寫成的 複製內容到剪貼簿
**:void* tprocess1(void* args)這樣的形式,完全是為了迎合pthread_create函式的引數型別,你也可以不這樣定義,只要在呼叫pthread_create建立執行緒的時候強制轉換一下指標型別就可以了。
這兩個函式將被用做執行緒的執行體,也就是說在兩個執行緒裡同時執行這兩個函式。
現在我們來看main函式,和pthread有關的呼叫都在這裡了。
pthread_t是執行緒結構,用來儲存執行緒相關資料,你也可以理解為是執行緒型別,宣告一個執行緒物件(變數)。 複製內容到剪貼簿
**:pthread_t t1;
pthread_t t2;這裡我們宣告瞭兩個執行緒變數t1,t2 複製內容到剪貼簿
這兩句非常重要,pthread_create用來建立執行緒並啟動,他的原型是 複製內容到剪貼簿
**:int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); 我們可以知道第一個引數是執行緒指標,第二引數是執行緒屬性指標,執行緒屬性pthread_attr_t用來指定執行緒優先順序等屬性,一般的情況下,我們沒有必要修改,使用預設屬性來構造執行緒,所以這裡一般取null,我們也是這樣做的,第三個引數是一個函式指標(函式指標?什麼東西,沒聽說過啊?
……巨暈,好嘛,你複習一下c或是c++指標那部分吧)就是執行緒要執行的**,這裡我們分別要執行tprocess1 tprocess2就寫成了上面的樣子,這裡這個函式指標的型別定義是返回一個空型別指標,接收一個空型別指標引數的函式指標,如果你的函式不是這個定義,那就可以直接轉化一下就可以了。
寫完這兩行**,兩個執行緒就已經執行起來了,但是如果你省略了 複製內容到剪貼簿
**:pthread_join(t1,null);
然後嘗試編譯執行程式的時候你會發現程式似乎什麼也沒幹就退出了,是的,那是因為程式的主執行緒退出的時候作業系統會關閉應用程式使用的所有資源,包括執行緒……所以在main函式結束前我們得想辦法讓程式停下來,pthread_join方法的功能就是等待執行緒結束,要等的執行緒就是第一個引數,程式會在這個地方停下來,直到執行緒結束,第二個引數用來接受執行緒函式的返回值,是void**型別的指標,如果沒有返回值,就直接設為null吧。
程式寫好了,我們怎麼編譯執行它呢?
如果你使用的是linux:
在終端裡輸入
g++ thread.cpp -othread -lpthread
./thread
就可以完成程式的編譯及執行
如果你用的是vc:
在工程屬性里加入開發包裡的幾個庫檔案
把那幾個dll檔案放到你的工程路徑裡,也就是程式執行時候的工作路徑,這個在vc6和2005裡似乎不太一樣,如果你不確定,那就直接放到system32裡吧。。。
下面的工作就非常簡單了
點執行,提示編譯,就確定,好了,結果出來了。。。
是不是感覺多執行緒如此的簡單,短短几行**就搞定了,我想你已經可以寫出一個簡單的多執行緒程式了吧,呵呵,其實問題沒有這麼簡單,多執行緒我們還要面對執行緒同步的問題,我會在下一個專題裡給大家講到。
3樓:
通常使用createthread函式來建立新的執行緒.(unix下使用pthread_create函式)
首先指出,執行緒與執行緒之間,是並列關係,不會存在"父子執行緒"的概念.
在windows平臺下,createthread函式包含在 windows.h 檔案內,包含此檔案即可正常使用.
以下為createthread函式的宣告:
handle createthread(
lpsecurity_attributes lpthreadattributes,//指向安全性屬性描述結構體的
//指標,通常可以忽略的.
size_t dwstacksize,//指定新執行緒初始的棧大小,若不關心,可以用0填充,來要求使用
//預設值
lpthread_start_routine lpstartaddress,//用來充當執行緒的函式的指標.
lpvoid lpparameter,//要傳遞給函式的引數,這個值本身就是那個引數,而不是引數的地址
dword dwcreationflags,//建立的方式,0表示正常,建立後立即開始執行
lpdword lpthreadid//用來接受函式反饋的執行緒id的指標.
);用來充當新的執行緒的函式格式:
dword winapi threadproc(lpvoid);
createthread函式若成功了,返回新執行緒的控制代碼,若失敗了,則返回null.
若用create_suspended填充dwcreation flags則建立的執行緒先掛起來,並不直接開始執行,要用resumethread函式恢復執行緒,才能繼續執行.
c語言如何實現多執行緒同時執行
4樓:匿名使用者
1、使用pthread庫
執行多執行緒,這個是linux下的執行緒庫 windows下應該有自己的api,不過這種東西一般還是以linux為標準。pthread_create()建立一個執行緒,傳入fun()的函式指標就行了。
2、例程:
#include
#include
#include
#include
#define max 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0, i;
void *thread1()
printf("thread1 :主函式在等我完成任務嗎?\n");
pthread_exit(null);
}void *thread2()
printf("thread2 :主函式在等我完成任務嗎?\n");
pthread_exit(null);
}void thread_create(void)void thread_wait(void)if(thread[1] !=0)
}int main()
5樓:幻の奇跡
c11自帶多執行緒庫,舊版本的c則要呼叫對應的系統api或第三方庫
用c語言開多執行緒,想讓多個相同的子執行緒同時執行,怎麼實現
6樓:匿名使用者
工作執行緒是處理後臺工作的,建立一個執行緒非常簡單,只需要兩步:實線執行緒函式和開始執行緒.不需要由cwinthread派生類,你可以不加修改地使用cwinthread。
afxbeginthread有兩種形式,一種是用來建立使用者介面執行緒的,另一種就是用來建立工作執行緒的.為了開始執行執行緒,只需要向afxbeginthread提供下面的引數就可以了.
1.執行緒函式的地址
2.傳送到執行緒函式的引數
3.(可選的)執行緒的優先順序,可參閱::setthreadpriority
4.(可選的)執行緒開始時候的狀態,可設定為create_suspenede
5.(可選的)執行緒的安全屬性,請參閱security_attributes
例項**
uint threadproc(lpvoid pparam)
cwinthread* afxbeginthreadproc,//執行緒函式地址
lpvoid pparam,//執行緒引數
int npriority=thread+priority_nomal,//執行緒優先順序
int nstacksize=0,//執行緒堆疊大小,預設為1m
dword dwcreateflags=0,
lpsecurity_attributes lpsecurityattrs=null);
在c語言中如何實現函式,在c語言中如何實現函式模板
go陌小潔 各種用 c 語言實現的模板可能在使用形式上有所不同。現以一個求和函式 sum 為例,用 c template 可寫如下 template r sum const t array,int n 如果不是內建型別,該模板隱式地需要 有r r operator t 運算子可用。1.使用函式指標作...
c語言中dowhile或者while迴圈裡能不能巢狀for迴圈
路林嘉金鑫 迴圈當然可以巢狀迴圈.就像if可以巢狀一樣.我覺得可以將最外層的do.while語句改為while 1 守望中的守護 可以。不管是do while還是while都可以巢狀for迴圈,而且可以巢狀任意多個for迴圈。不僅如此,這三種迴圈語句可以任意相互巢狀,個數不限。但是過多的迴圈巢狀 會...
C語言中如何實現計算器功能,c語言如何建立一個按鈕?做計算器用
如果你的表示式不超過一級括號,可以不使用棧.如你的例題,但象這樣不用棧很煩 3 4 3 2 6 3 如只有一級,沒人寫,就加我.include using namespace std bool cal double lv,char op,double rv,double val return tru...