这篇是进程线程的博文的最后一篇了,至此进程线程的所有同步内容已经全部回顾完了。 其中信号和信号量看起来名字很像,实际上却是完全不一样的两个东西,信号和信号量在进程线程中都可以使用。而且使用方式也基本完全一样。 进程中的共享内存,线程中的互斥锁,条件变量。这些是独有的,但实际也能互相使用,《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 }
测试结果:
在主线程收到其他线程发出的信号!