linux 线程间共享内核栈吗

linux 线程间共享内核栈吗,第1张

首先,我们知道所有线程共享主线程的虚拟地址空间(current->mm指向同一个地址),且都有自己的用户态堆栈(共享父进程的地址空间,再在里面分配自己的独立栈,默认2M)。这是毫无疑问的,但还有一点我没搞明白,内核栈是共享还是独立的?猜测:独立的。理由:要不然内核栈对应的thread_info中的tast_struct没有办法与每个线程对应起来,因为现在已经有多个task_struct了,但保存内核栈的thread_info(其实是thread_union联合体)中只能保存一个task_struct。所以理论上分析,虽然可以共享地址空间,但每个线程还是需要一个单独的内核栈的。看代码:分析创建线程最终肯定会走到内核函数do_fork()中来的,所以从此函数看起。do_fork()->copy_process()->dup_task_struct()fork.c中dup_task_struct()的实现:static struct task_struct *dup_task_struct(struct task_struct *orig){struct task_struct *tskstruct thread_info *tiunsigned long *stackendint node = tsk_fork_get_node(orig)int errtsk = alloc_task_struct_node(node)if (!tsk)return NULLti = alloc_thread_info_node(tsk, node)/*就是这里,果然分配内核栈了*/if (!ti)goto free_tskerr = arch_dup_task_struct(tsk, orig)/*这里分配task_struct结构*/if (err)goto free_titsk->stack = ti...}

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)

1,你可以设一个缓冲区,所有读取线程把读取的文件内容放在这个缓冲区内.另设一个专门用来建立数据库的线程.从这个缓冲区内读文件并写入数据库.

上锁的地方不应该在在数据上.那样太没效率,很浪费资源.只要在执行向缓冲区写内容的地方同步控制即可.

2,不清楚.这个太复杂了.我不知道.不过如果是并发的插入和读取的话只要在I/O *** 作时同步即可.

3....- -


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7581469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-07
下一篇 2023-04-07

发表评论

登录后才能评论

评论列表(0条)

保存