線(xiàn)程并發(fā)要求
線(xiàn)程并發(fā)性
同步:進(jìn)程/線(xiàn)程中的部分指令需要按照一定的順序前后執(zhí)行
異步:進(jìn)程/線(xiàn)程之前的指令執(zhí)行順序無(wú)序
競(jìng)爭(zhēng):對(duì)于有限資源的共享使用過(guò)程中產(chǎn)生的競(jìng)爭(zhēng)過(guò)程
互斥:對(duì)于共享資源的操作同時(shí)只能有一個(gè)進(jìn)程/線(xiàn)程
死鎖:互相等待資源
饑餓:長(zhǎng)時(shí)間無(wú)法獲取資源
exec 替換 進(jìn)程空間
exit 退出程序,相關(guān)聯(lián)的程序被掛起(堵塞狀態(tài))
線(xiàn)程退出pthread_exit
地址值當(dāng)整數(shù)
線(xiàn)程在運(yùn)行中,要防止另一條線(xiàn)程更改變量或變量地址
sem族函數(shù)
sem_open,計(jì)算機(jī)用語(yǔ)。意思是創(chuàng)建并初始化有名信號(hào)燈
sem_init
#include<semaphore.h>
sem_init() 初始化一個(gè)定位在 sem 的匿名信號(hào)量
sem_destroy() 銷(xiāo)毀由sem指向的匿名信號(hào)量
sem_post是給信號(hào)量的值加上一個(gè)“1”,它是一個(gè)“原子操作”——即同時(shí)對(duì)同一個(gè)信號(hào)量做加“1”操作的兩個(gè)線(xiàn)程是不會(huì)沖突的;而同 時(shí)對(duì)同一個(gè)文件進(jìn)行讀、加和寫(xiě)操作的兩個(gè)程序就有可能會(huì)引起沖突
sem_wait函數(shù)也是一個(gè)原子操作,它的作用是從信號(hào)量的值減去一個(gè)“1”,但它永遠(yuǎn)會(huì)先等待該信號(hào)量為一個(gè)非零值才開(kāi)始做減法
信號(hào)量的數(shù)據(jù)類(lèi)型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個(gè)長(zhǎng)整型的數(shù)
單線(xiàn)程處理函數(shù)分步加法
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
//定義傳遞個(gè)線(xiàn)程的參數(shù)結(jié)構(gòu)類(lèi)型
struct thread_arg
{
int thread_no;//線(xiàn)程編號(hào)
int lower;//區(qū)間首
int upper;//區(qū)間末
};
//定義用于接收線(xiàn)程計(jì)算返回值
struct thread_arg argument1 , argument2;
void *add_thread_func(void *arg);
int main (int argc , char *argv[])
{
pthread_t thread_id1;
pthread_t thread_id2;
//定義指向線(xiàn)程返回結(jié)果空間的地址
int *psum1 = NULL;
int *psum2 = NULL;
//創(chuàng)建線(xiàn)程1
argument1.thread_no=1;
argument1.lower=1;
argument1.upper=50;
pthread_create(&thread_id1, NULL, add_thread_func, &argument1);
//創(chuàng)建線(xiàn)程2
argument2.thread_no=2;
argument2.lower=51;
argument2.upper=100;
pthread_create(&thread_id2, NULL, add_thread_func, &argument2);
//等待線(xiàn)程退出,并接受線(xiàn)程返回值
pthread_join(thread_id1, &psum1);
pthread_join(thread_id2, &psum2);
printf("sum=%d\n",*psum1 + *psum2);
free(psum1);
free(psum2);
return 0;
}
//線(xiàn)程函數(shù)
void *add_thread_func(void *arg)
{
struct thread_arg *p_arg = (struct thread_arg *)arg;
int i=0;
int sum =0;
int *p_res = NULL;
//累和
for (i=p_arg->lower;i<p_arg->upper+1;i++ )
sum+=i;
//開(kāi)辟空間存放結(jié)果
p_res = (int *)malloc(sizeof(int));
*p_res=sum;
//線(xiàn)程返回結(jié)果并退出
pthread_exit (p_res);
}
互斥鎖交替執(zhí)行雙線(xiàn)程
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
pthread_mutex_t mutex ;//線(xiàn)程互斥鎖
void thread_func1(void *arg);//線(xiàn)程1
void thread_func2(void *arg);//線(xiàn)程2
int main (int argc , char *argv[])
{
pthread_t thread_id1;//用于聲明線(xiàn)程ID
pthread_t thread_id2;
pthread_mutex_init(&mutex,NULL);//互斥鎖初始化
pthread_create(&thread_id1,NULL,thread_func1,NULL);
pthread_create(&thread_id2,NULL,thread_func2,NULL);
pthread_join(thread_id1,NULL);
pthread_join(thread_id2,NULL);
printf("main thread exit\n");
return 0;
}
//互斥鎖的獲取和釋放必須成對(duì)出現(xiàn)
void thread_func1(void *arg)
{
pthread_mutex_lock(&mutex);//獲取互斥鎖
printf("pthread 1\n");
pthread_mutex_unlock(&mutex);//釋放互斥鎖
}
//線(xiàn)程二
void thread_func2(void *arg)
{
pthread_mutex_lock(&mutex);
printf("pthread 2\n");
pthread_mutex_unlock(&mutex);
}