古詩詞大全網 - 成語查詢 - Linux線程及同步

Linux線程及同步

linux多線程

1.線程概述

線程是壹個進程內的基本調度單位,也可以稱為輕量級進程。線程是在***享內存空間中並發的多道執行路徑,它們***享壹個進程的資源,如文件描述和信號處理。因此,大大減少了上下文切換的開銷。壹個進程可以有多個線程,也就

是有多個線程控制表及堆棧寄存器,但卻***享壹個用戶地址空間。

2.線程實現

線程創建pthread_create()

所需頭文件#include

<pthread.h>

函數原型int

pthread_create

((pthread_t

*thread,

pthread_attr_t

*attr,

thread:線程標識符

attr:線程屬性設置

start_routine:線程函數的起始地址

arg:傳遞給start_routine的參數

函數返回值

成功:0

出錯:-1

線程退出pthread_exit();

所需頭文件#include

<pthread.h>

函數原型void

pthread_exit(void

*retval)

函數傳入值retval:pthread_exit()調用者線程的返回值,可由其他函數如pthread_join

來檢索獲取

等待線程退出並釋放資源pthread_join()

所需頭文件#include

<pthread.h>

函數原型int

pthread_join

((pthread_t

th,

void

**thread_return))

函數傳入值

th:等待線程的標識符

thread_return:用戶定義的指針,用來存儲被等待線程的返回值(不為NULL時)

函數返回值

成功:0

出錯:-1

代碼舉例

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

/*線程1*/

6.

void

thread1()

7.

{

8.

int

i=0;

9.

10.

while(1)

11.

{

12.

printf(thread1:%d/n,i);

13.

if(i>3)

14.

pthread_exit(0);

15.

i++;

16.

sleep(1);

17.

}

18.

}

19.

20.

/*線程2*/

21.

void

thread2()

22.

{

23.

int

i=0;

24.

25.

while(1)

26.

{

27.

printf(thread2:%d/n,i);

28.

if(i>5)

29.

pthread_exit(0);

30.

i++;

31.

sleep(1);

32.

}

33.

}

34.

35.

int

main()

36.

{

37.

pthread_t

t1,t2;

38.

39.

/*創建線程*/

40.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

41.

pthread_create(&t2,NULL,(void

*)thread2,NULL);

42.

/*等待線程退出*/

43.

pthread_join(t1,NULL);

44.

pthread_join(t2,NULL);

45.

return

0;

46.

}

3同步與互斥

<1>互斥鎖

互斥鎖的操作主要包括以下幾個步驟。

互斥鎖初始化:pthread_mutex_init

互斥鎖上鎖:pthread_mutex_lock

互斥鎖判斷上鎖:pthread_mutex_trylock

互斥鎖接鎖:pthread_mutex_unlock

消除互斥鎖:pthread_mutex_destroy

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0;/****享變量*/

6.

pthread_mutex_t

mutex=PTHREAD_MUTEX_INITIALIZER;/*互斥鎖*/

7.

8.

void

thread1()

9.

{

10.

int

ret;

11.

while(1)

12.

{

13.

14.

15.

ret=pthread_mutex_trylock(&mutex);/*判斷上鎖*/

16.

17.

if(ret!=EBUSY)

18.

{

19.

pthread_mutex_lock(&mutex);/*上鎖*/

20.

printf(This

is

thread1:%d/n,i);

21.

i++;

22.

pthread_mutex_unlock(&mutex);/*解鎖*/

23.

}

24.

sleep(1);

25.

}

26.

}

27.

28.

void

thread2()

29.

{int

ret;

30.

while(1)

31.

{

32.

33.

ret=pthread_mutex_trylock(&mutex);

34.

if(ret!=EBUSY)

35.

{

36.

pthread_mutex_lock(&mutex);

37.

printf(This

is

thread2:%d/n,i);

38.

i++;

39.

pthread_mutex_unlock(&mutex);

40.

}

41.

sleep(1);

42.

}

43.

}

44.

int

main()

45.

{

46.

pthread_t

t1,t2;

47.

pthread_mutex_init(&mutex,NULL);

48.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

49.

pthread_create(&t2,NULL,(void

*)thread2,NULL);

50.

51.

pthread_join(t1,NULL);

52.

pthread_join(t2,NULL);

53.

54.

pthread_mutex_destroy(&mutex);

55.

return

0;

56.

}

<2>信號量

未進行同步處理的兩個線程

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0;

6.

void

thread1()

7.

{

8.

9.

while(1)

10.

{

11.

printf(This

is

thread1:%d/n,i);

12.

i++;

13.

sleep(1);

14.

}

15.

}

16.

17.

18.

void

thread2()

19.

{

20.

21.

while(1)

22.

{

23.

printf(This

is

thread2:%d/n,i);

24.

i++;

25.

sleep(1);

26.

}

27.

}

28.

29.

int

main()

30.

{

31.

pthread_t

t1,t2;

32.

33.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

34.

pthread_create(&t2,NULL,(void

*)thread2,NULL);