zoukankan      html  css  js  c++  java
  • 线程同步(四)—— 信号

    这篇是进程线程的博文的最后一篇了,至此进程线程的所有同步内容已经全部回顾完了。

    其中信号和信号量看起来名字很像,实际上却是完全不一样的两个东西,信号和信号量在进程线程中都可以使用。而且使用方式也基本完全一样。

    进程中的共享内存,线程中的互斥锁,条件变量。这些是独有的,但实际也能互相使用,《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, '', 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 }

    测试结果:

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

  • 相关阅读:
    对象工厂函数与构造函数
    H5案例学习笔记
    对象工厂函数与构造函数
    JS对象的创建与使用
    CSS浏览器兼容性写法小结
    网页布局二三事
    关于URL、Web的一些概念
    什么是单点登录及解决方法
    Django--model-数据库操作
    Vue端增删改查实现
  • 原文地址:https://www.cnblogs.com/binchen-china/p/5471331.html
Copyright © 2011-2022 走看看