linux c语言 线程 小消息队列(linux c语言 线程)

linux

c语言双线程锁的例子?

在Linux使用C语言编辑程序使用互斥锁实现两个线程之间同步,一个线程负责从标准输入设备中读取数据,而另一个线程则负责将读入的数据输出到标准输出设备上,当输入“end”时结束该程序。

linux下如何实现两个内核线程之间的通信?

线程间通信就是通过全局变量啊,线程之间没有“通信”的说法吧,不管有几个线程,它们都是在同一个进程地址空间内,都共享同样的内存空间,所以“通信”的说法才多见于进程之间,因为不同的进程才是不同的内存地址空间。进程内的变量每个线程都是可以访问的,是共享的,但是线程之间没有固定的执行顺序,为避免时序上的不同步问题,所以线程之间才会需要同步机制。线程之间的重点就是同步机制。

linux多线程详解?

1.进程是操作系统分配资源的基本单位。而线程通俗来讲就是一个进程中一个执行流。

2.这里以串行与并行下载文件举例,如果我们使用串行的方式去下载多个文件,那么得到的结果是,将这些文件逐个按个的下载,即上一个下载完成之后才会下载接下来的文件。

3.如果使用并行的方式下载,那么这些文件就会一次同时下载多个文件,而不是等待上一个下载完后才继续下载接下来的,大大的提高了下载效率。

linux下C中怎么让才能安全关闭线程?

这个问题,首先得搞清楚线程关闭或者退出有哪些方式

线程的退出方式

如果进程中的任何线程调用exit,_Exit或_exit,则整个进程终止。 类似地,当信号的默认操作是终止进程时,发送到线程的信号将终止整个进程。单个线程可以有三种方式退出其控制流程,而不会终止整个进程。

1线程可以简单地从线程处理程序中返回,返回值是线程的退出代码。

2该线程可以被同一进程中的另一个线程取消。

3该线程可以调用pthread_exi

线程退出的返回值

#include <pthread.h> void pthread_exit(void *rval_ptr);
#include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr);

pthread_join函数的rval_ptr参数是无类型指针。进程中的其他线程可通过调用pthread_join函数来使用rval_ptr指针,调用它线程将阻塞,直到指定的线程调用pthread_exit或从其线程处理程序中返回或被取消。如果只是从其线程处理程序返回,则rval_ptr将包含返回码。如果线程被取消,则rval_ptr指定的内存位置设置为PTHREAD_CANCELED。

通过调用pthread_join,自动会将加入的线程放置在分离状态,如果线程已处于分离状态,则pthread_join可能会失败,返回EINVAL。如果我们对线程的返回值不感兴趣,我们可以将rval_ptr设置为NULL。在这种情况下,调用pthread_join允许我们等待指定的线程,但不去检索线程的终止状态。

下图显示了如何从已终止的线程中获取退出代码

运行结果:

lj@lj-PC:~$ ./ptest

thread 1 returning

thread 2 exiting

thread 1 exit code 1

thread 2 exit code 2

线程如何取消

一个线程可以通过调用pthread_cancel函数请求取消同一进程中的另一个。

#include <pthread.h>
int pthread_cancel(pthread_t tid);

在默认情况下,pthread_cancel将使tid指定的线程的行为就像它使用PTHREAD_CANCELED参数调用pthread_exit一样。 但是,线程可以选择忽略或以其他方式控制取消的方式。 请注意,pthread_cancel不会等待线程终止。

线程可以安排函数在退出时被调用,这些函数称为线程清理处理程序。 可以为一个线程建立多个清理处理程序。 处理程序记录在堆栈中,这意味着它们的执行顺序与它们注册的顺序相反。

#include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);

当线程执行以下操作之一时,pthread_cleanup_push函数会被调用

调用pthread_exit

回复取消请求

使用非零执行参数调用pthread_cleanup_pop

如果execute参数设置为零,则不会调用cleanup函数。 在任何一种情况下,pthread_cleanup_pop都会删除最后一次调用pthread_cleanup_push所建立的清理处理程序。

下图举例如何使用线程清理处理程序。

运行结果:

lj@lj-PC:~$ ./pclean

thread 1 start

thread 1 push complete

thread 2 start

thread 1 exit code 1

thread 2 push complete

cleanup: thread 2 second handler

cleanup: thread 2 first handler

thread 2 exit code 2

从输出中,我们可以看到两个线程都正常启动并退出,但只调用了第二个线程的清理处理程序。因此,如果线程是通过其处理函数直接返回而终止,则不会调用其清理处理程序,不过此行为在具体平台实现之间会有所不同。另请注意,清理处理程序的调用顺序与安装它们的顺序相反。

如果我们在FreeBSD或Mac OS X上运行相同的程序,我们会发现该程序会导致段错误。发生这种情况是因为在这些系统上,pthread_cleanup_push实现为在堆栈上存储某些上下文的宏。当线程1在对pthread_cleanup_push的调用和对pthread_cleanup_pop的调用之间返回时,堆栈被覆盖,并且这些平台在调用清理处理程序时尝试使用此(已损坏的)上下文。在Single UNIX Specification中,在对pthread_cleanup_push和pthread_cleanup_pop的一对匹配调用之间返回会导致未定义的行为。在这两个函数之间返回的唯一可移植方法是调用pthread_exit。

线程和进程的类似操作

从上文我们可以看到线程和进程的相似之处,见如下表格:

讲了这么多,还有好多细节没有讲到,只要详细的了解了这些细节,我相信关于你的这个问题“linux下C中怎么让才能安全关闭线程”自然就有了答案。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平