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