多執行緒實現多工一
概述
每個程式都擁有自己的資料段、程式碼段和堆疊段,這就造成程式在進行建立、切換、撤銷操作時,需要較大的系統開銷。為了減少系統開銷,從程式中演化出了執行緒。為了讓程式完成一定的工作,程式必須至少包含一個執行緒。執行緒存在於程式中,共享程式的資源。
就像每個程式都有一個程式號一樣,每個執行緒也有一個執行緒號。程式號在整個系統中是唯一的,但執行緒號不同,執行緒號只在它所屬的程式環境中有效。程式號用 pid_t 資料型別表示,是一個非負整數。執行緒號則用 pthread_t 資料型別來表示,Linux 使用無符號長整數表示。有的系統在實現 pthread_t 的時候,用一個結構體來表示,所以在可移植的作業系統實現不能把它做為整數處理。
執行緒的常用函式
1)獲取執行緒號
所需標頭檔案:
#include <pthread.h>
pthread_t pthread_self(void) ;
功能:
獲取執行緒號。
引數:
無
返回值:
呼叫執行緒的執行緒 ID 。
2)執行緒號的比較
所需標頭檔案:
#include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);
功能:
判斷執行緒號 t1 和 t2 是否相等。為了方便移植,儘量使用函式來比較執行緒 ID。
引數:
t1,t2:待判斷的執行緒號。
返回值:
相等: 非 0
不相等:0
示例程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int main(int argc, char *argv[])
{
pthread_t thread_id;
thread_id = pthread_self(); // 返回撥用執行緒的執行緒ID
printf("Thread ID = %lu \n",thread_id);
if( 0 != pthread_equal( thread_id, pthread_self() ) ){
printf("Equal!\n");
}else{
printf("Not equal!\n");
}
return 0;
}
執行緒函式的程式在 pthread 庫中,故連結時要加上引數 -lpthread。
執行結果如下:
3)執行緒的建立
所需標頭檔案:
#include <pthread.h>
int pthread_create( pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg );
功能:
建立一個執行緒。
引數:
thread:執行緒識別符號地址。
attr:執行緒屬性結構體地址,通常設定為 NULL。
start_routine:執行緒函式的入口地址。
arg:傳給執行緒函式的引數。
返回值:
成功:0
失敗:非 0
pthread_create() 建立的執行緒從指定的回撥函式開始執行,該函式執行完後,該執行緒也就退出了。執行緒依賴程式存在的,共享程式的資源,如果建立執行緒的程式結束了,執行緒也就結束了。
示例一:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int var = 8;
void *thread_1(void *arg)
{
while(1)
{
printf("this is my new thread1: var++\n");
var++;
sleep(1);
}
return NULL;
}
void *thread_2(void * arg)
{
while(1){
printf("this is my new thread2: var = %d\n", var);
sleep(1);
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t tid1,tid2;
//建立兩個執行緒
pthread_create(&tid1, NULL, thread_1, NULL);
pthread_create(&tid2, NULL, thread_2, NULL);
while(1){
printf("the main thread: var = %d\n", var);
sleep(1);
}
return 0;
}
執行結果如下:
示例二:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// 回撥函式
void *thread_fun(void * arg)
{
sleep(1);
int num = *( (int *)arg );
printf("int the new thread: num = %d\n", num);
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t tid;
int test = 100;
// 建立執行緒, 把 &test 傳給回撥函式 thread_fun()
pthread_create(&tid, NULL, thread_fun, (void *)&test);
while(1);
return 0;
}
執行結果如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657276/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒實現多工二執行緒
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- 如何實現多執行緒執行緒
- 多執行緒原理實現執行緒
- Python中的多工:多執行緒Python執行緒
- Java多執行緒實現方式Java執行緒
- 多執行緒具體實現執行緒
- Java多執行緒的實現Java執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Runnable介面實現多執行緒執行緒
- python多執行緒實現Python執行緒
- NSThread實現多執行緒thread執行緒
- NSThread多執行緒實現thread執行緒
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- 多執行緒-匿名內部類的方式實現多執行緒程式執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 多執行緒(一)執行緒
- 多工處理方式之二:多執行緒執行緒
- JSRE中的多工與多執行緒JS執行緒
- python--多工執行緒Python執行緒
- 多執行緒-多執行緒方式1的程式碼實現執行緒
- 實戰.Net多執行緒(一)執行緒
- 多執行緒和多執行緒同步執行緒
- 多執行緒爬蟲實現(上)執行緒爬蟲
- java實現多執行緒的方法Java執行緒
- 面試-實現多執行緒的方式面試執行緒
- Java多執行緒的實現方法Java執行緒
- 實驗--多執行緒執行緒
- 多執行緒安全(一)執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- 多執行緒與高併發(一)多執行緒入門執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- 多執行緒-多執行緒方式2的思路及程式碼實現執行緒
- 多執行緒,多程式執行緒
- 多執行緒系列(一):認識執行緒執行緒
- 用多執行緒,實現併發,TCP執行緒TCP
- 多執行緒伺服器的實現執行緒伺服器