Linux學習第十一天

2021-09-24 22:25:07 字數 4982 閱讀 4854

一、昨日回顧

1、訊號處理sigaction

2、使用sigaction如何實現不斷重入效果?

struct sigaction act;

act.sa_flags=sa_siginfo|sa_nodefer;

3、想在2號訊號的處理流程過程中,遮蔽3號訊號

struct sigaction act;

act.sa_flags=siginfo;

act.sa_sigaction=sig_func;

sigemptyset(&act.sa_mask);

sigaddset(&act.sa_mask,sigquit);

4、如何設定訊號遮蔽?

sigset_t mask;

sigemptyset(&mask);

sigaddset(&mask,sigquit);//設定遮蔽訊號

sigprocmask(sig_block,&mask,null);//增加遮蔽

sleep(3);

sigpromask(sig_unblock,&mask,null);//解除遮蔽

5、執行緒pthread

(1)執行緒建立pthread_create(&pthid,null,thread_func,null);

(2)執行緒退出pthread_exit((void)*2)

(3)執行緒合併

long threadret;

pthread_join(pthid,(void**)&threadpret);

二、上午內容

1、執行緒清理

(1)檢視清理函式的執行順序

①**示例pthread_cleanup_exec.c(

已完成)

#include"func.h"

void cleanup(void*p)

void *thread_func(void *p)

int main(int argc, char* ar**)

ⅰ先壓棧的清理函式後執行

ⅱ該功能使用的是清理棧

②工作的時候如何寫清理資源?

**示例pthread_cleanup_malloc.c(已完成)

#include"func.h"

void cleanup(void*p)

void *thread_func(void *p)

int main(int argc, char* ar**)

2、執行緒的同步與互斥:雙方互斥進行

(1)互斥鎖

①鎖的初始化

ⅰ使用函式

pthread_mutex_t mutex;

pthread_mutex_init;

②加鎖操作

ⅰ使用函式pthread_mutex_lock();

ⅱ**示例

pthread_add2000.c

#include

#define n 20000000

typedef structdata_t;

void* threadfunc(void* p)

}int main(int argc,char* ar**)

pthread_join(pthid,null);//等待子執行緒

gettimeofday(&end,null);

printf("i am main thread,val=%d,use time=%ld\n",threadinfo.val,(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec);

return 0;}

③解鎖操作

ⅰ**例子pthread_mutex_trylock.c

#include

typedef structdata_t;

void* threadfunc(void* p)

int main(int argc,char* ar**)

④測試加鎖

ⅰ**示例sem_add1000.c

#include

#define n 20000000

int main(int argc,char* ar**)

}else

wait(null);

gettimeofday(&end,null);

printf("result=%d,use time=%ld\n",p[0],(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec);

}return 0;}

(2)別人加的鎖,可以解開嗎? ①

ⅰ**例子pthread_mutex_trylock.c

#include

typedef structdata_t;

void* threadfunc(void* p)

int main(int argc,char* ar**)

ⅱ**例子pthread_mutex_unlock_other.c

#include

typedef structdata_t;

void* threadfunc(void* p)

int main(int argc,char* ar**)

鎖傳遞,應該傳遞位址

3、使用執行緒鎖統計時間

三、下午的內容

1、如何加鎖?

①加兩次鎖

使用命令pthread_mutex_lock

**例子pth

read_mutex_locktwice.c

(已完成)

給鎖加兩次鎖

#include"func.h"

int main(int argc,char* ar**)

②如何檢測是否有錯誤

**示例

thread_mutex_errorcheck.c

避免對同一把鎖加鎖兩次

#include

int main(int argc,char* ar**)

③使用程序鎖進行2000萬加法。

**示例

fork_mutex.c

#include

#define n 20000000

typedef structdata_t,*pdata_t;

int main(int argc,char* ar**)

}else

wait(null);

gettimeofday(&end,null);

printf("result=%d,use time=%ld\n",p->val,(end.tv_sec-start.tv_sec)*1000000+end.tv_usec-start.tv_usec);

}return 0;}

tips:

ⅰ鎖使用的區域是在共享記憶體內

ⅱ在加鎖**中,先加鎖,在執行操作,之後再解鎖

④**示例sale_tickets.c

#include

typedef structdata_t;

void cleanup(void *p)

void* salewindows1(void* p)

else

}return null;

}void* salewindows2(void* p)

else

}return null;

}int main(int argc,char* ar**)

tips:

ⅰ在判斷有沒有票之前,就要加乙個鎖

2、條件變數

(1)兩個執行緒要設定等待和激發

ⅰ等待條件有兩種方式:無條件等待和有條件等待

ⅱ通過這種方式,就可以實現執行緒同步

!!要注意區別:程序間通訊和程序間的同步

程序間的同步:可以通過管道、訊息佇列、或者訊號量實現

①等待與激發

ⅰ首先要初始化乙個引數

**示例:(子執行緒等待,主線程執行)

pthread_cond.c

#include

typedef structdata_t,*pdata_t;

void* threadfunc(void* p)

int main(int argc,char* ar**)

②乙個函式

上半部:

ⅰ排隊在對應的cond

ⅱ解鎖ⅲ睡覺

下半部

ⅰ醒來

ⅱ加鎖

ⅲ返回

③ ⅰ條件變數初始化:pthread_cond_init

ⅱ讓條件變數成立pthread_cond_signal//讓條件變數成立

tips:核心真正在排程的時候,排程單位是核心執行緒

④新的**示例

pthread_cond_twowait.c

#include

typedef structdata_t,*pdata_t;

void cleanup(void *p)

void* threadfunc(void* p)

#define n 2

int main(int argc,char* ar**)

int ret;

for(i=0;i

for(i=0;i

printf("i am main thread\n");

return 0;}

tips:

ⅰ多個執行緒在等待,**示例是2個執行緒在等待

ⅱ如何解決無法cancel執行緒的問題?使用cleanup,其中push放在wait前邊,pop放在wait後邊;要注意,要定義乙個cleanup函式

⑤超時等待,**示例

pthread_cond_timedwait.c

#include

typedef structdata_t,*pdata_t;

void* threadfunc(void* p)

int main(int argc,char* ar**)

UnixC第十一天

回憶昨天內容 一 訊號阻塞 sigprocmask 2 sigset t 訊號阻塞和訊號忽略的區別 可靠訊號 不可靠 訊號丟失 二 獲取程序的未決訊號集 從未決訊號集中找未決訊號 sigpending 2 什麼是未決訊號?三 訊號從產生到處理的整個過程 四 system v ipc 訊息佇列 獲取乙...

第十一天作業

第一題 import time import random deffoo print 開始執行。time.sleep random.uniform 1,3 print 執行完畢 return 都結束了 print foo 第二題 import time import random deffoo pr...

python第十一天

函式總結 def func a,b print a,b return a b 四個組成部分 函式名 呼叫函式的依據 函式體 執行函式邏輯的 引數列表 為函式提供內部資源 返回值 將函式執行結果返回給外界 返回值 1 空返回 沒有return或空return 2 一鍵返回 3 多值返回 裝有多個值的元...