线程同步(四)—— 信号

这篇是进程线程的博文的最后一篇了,至此进程线程的所有同步内容已经全部回顾完了。 其中信号和信号量看起来名字很像,实际上却是完全不一样的两个东西,信号和信号量在进程线程中都可以使用。而且使用方式也基本完全一样。 进程中的共享内存,线程中的互斥锁,条件变量。这些是独有的,但实际也能互相使用,《Unix网络编程》中对这些的总结是按需所用。

前面提到过线程回收,类似进程回收,线程回收的pthread_join也是接收子线程的销毁消息。 使用kill -l查看linux中的信号。 这次还是使用USR1信号作为用户的定义信号,进行线程的通信。 这块代码由于需要给指定的函数传入函数指针,为了消除this指针使用了几个static静态函数和静态成员。比较暴力QAQ

1 #include <sys/types.h>
 2 #include <pthread.h>  
 3 #include <unistd.h>
 4 #include <signal.h>
 5 #include <string.h>
 6 #include <iostream>
 7 #include <stdlib.h>
 8 
 9 using namespace std;
10 
11 class sigOp
12 {
13 public:
14     void addSigProcess(int sig,void (*func)(int));
15     void sendSig(const int sig, const int pid);
16 };
17 void sigOp::addSigProcess(int sig,void (*func)(int))
18 {
19     struct sigaction stuSig;
20     memset(&stuSig, '\0', sizeof(stuSig));
21     stuSig.sa_handler = func;
22     stuSig.sa_flags |= SA_RESTART;
23     sigfillset(&stuSig.sa_mask);
24     sigaction(sig, &stuSig, NULL);
25 }
26 void sigOp::sendSig(const int sig, const int pid)
27 {
28     pthread_kill(pid, sig);
29     cout<<"send!"<<endl;
30 }
31 
32 class ThreadInterface
33 {
34 public:
35     void CreateThread(void* (*func)(void *),void *threadID);
36     static void WaitThread(int);
37 private:
38     static pthread_t m_pTread;   //给静态函数使用
39 };
40 pthread_t ThreadInterface::m_pTread;//类外实例静态成员
41 
42 void ThreadInterface::CreateThread(void* (*func)(void *),void *threadID)
43 {
44     pthread_create(&m_pTread, NULL, func, threadID); 
45 }
46 
47 void ThreadInterface::WaitThread(int)
48 {
49     pthread_join(m_pTread, NULL);    
50 }
51 
52 class Service
53 {
54 public:
55     static void* run(void *threadID)
56     {
57         pthread_t *pTreadID = reinterpret_cast<pthread_t *>(threadID);
58         pthread_kill(*pTreadID, SIGUSR1);
59         
60     }
61     static void recSig(int)
62     {
63         cout<<"rev sig!"<<endl;
64     }
65 };
66 
67 int main()
68 {
69     Service Srv;
70     ThreadInterface Thread;
71     
72     sigOp sig;
73     sig.addSigProcess(SIGUSR1, Srv.recSig);
74     sig.addSigProcess(SIGCHLD, Thread.WaitThread);
75 
76     pthread_t selfID = pthread_self();    
77     Thread.CreateThread(&Srv.run, &selfID);
78 
79     sleep(5);
80     return 0;
81 }

测试结果:

在主线程收到其他线程发出的信号!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

Roslyn 在项目文件使用条件判断 判断不相等判断大小判断文件存在判断多个条件使用的范围

本文是 手把手教你写 Roslyn 修改编译 的文章,在阅读本文之前,希望已经知道了大多数关于 msbuild 的知识

621
来自专栏我的博客

TP入门第七天

Trace信息无法显示,因为信息需要显示在body体内 1、创建数据 我们在php的action里面当然也可以使用$_POST以及$_GET获取变量,而TP提供...

2794
来自专栏JAVA技术zhai

干货:Java并发编程系列之volatile(二)

2114
来自专栏C/C++基础

C++覆盖或删除指定位置的文件内容

我们经常使用ofstream或者fstream可写文件,使用ifstream可以写文件,但需要设置文件的打开状态为ios::out。C++中IO流打开模式使用位...

1033
来自专栏流媒体

dll生成和使用

742
来自专栏武军超python专栏

2018年8月25日多线程编程总结

PYTHON 本身也支持多任务处理,并且提供了如下的操作方式 多线程多任务处理机制   (比较常用) 多进程多任务处理机制   (不常用,大型项目开发或者系...

864
来自专栏Core Net

ASP.NET Core 2.0 : 七.一张图看透启动背后的秘密

1672
来自专栏Android 研究

Android系统启动——7附录1:Android属性系统

属性系统在Android 系统中大量使用,用来保存系统级别的设置或者在进程间传递一些简单的信息。每个属性由属性名称和属性值组成,名称通常是一串‘.’分割的字符串...

861
来自专栏耕耘实录

几个Linux命令及脚本使用中的奇淫巧技

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

582
来自专栏古时的风筝

Java 开发, volatile 你必须了解一下

902

扫码关注云+社区