1-5linux系統(tǒng)編程——線(xiàn)程并發(fā)

線(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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容