zoukankan      html  css  js  c++  java
  • 【Linux】一个简单的线程创建和同步的例子

     

    最近很多精力在Linux上,今天简单看了一下Linux上的线程和同步,其实不管windows还是Linux,OS层面的很多原理和概念都是相同的,很多windows之上的经验和概念完全可以移植到Linux上。

    今天用到了创建线程和一个阻塞式的线程同步函数。

     

    用到的几个函数

    #include <pthread.h>
     
    
    //创建线程
    
    int  pthread_create(
    
    pthread_t* thread,                   /*线程标ID,   pthread_t  pthread_self(void) 可获取当前线程ID*/
    
    pthread_attr_t* attr,              /*线程属性,如无需要可为0 */
    
    void* (*start_routine)(void*), /*线程函数*/
    
    void* arg                               /*线程函数参数*/
    
    );
    
    
    
    返回值
    
    成功: 0
    
    失败:错误代码
    
    
    
    
    
    //终止线程
    
    void  pthread_exit(
    
    void* retval   /*线程返回时带回的值,注意局部变量等问题*/
    
    )
    
    
    //阻塞式线程同步
    
    int  pthread_join(
    
    pthread_t  th,  /*pthread_create 函数第一个参数带回的值*/
    
    void** thread  /*线程函数返回值,内存在此函数内部分配*/
    
    )
    
     
    
    
    //获取当前线程ID
    
    pthread_t   pthread_self(void)

     

    贴出代码

       /*a demo for Linux MultiThread   */
      3 #include <iostream>
      4 #include <pthread.h>
      5 #include <stdlib.h>
      6 #include <unistd.h>
      7 using namespace std;
      8 
      9 //thread function
     10 void*  start_routine(void* p)
     11 {
     12     if (0 == p)
     13         return 0;
     14 
     15     size_t nLoops = *( (size_t*) p );
     16 
     17     for (size_t i = 0; i < nLoops; ++ i)
     18     {
     19         cout << i << endl;
     20         usleep(1000 * 800);   //800 ms  
     21     }
     22 
     23     cout << endl << "This thread ID is " << pthread_self() << endl;
     24 
     25     return 0;
     26 }
     27 
     28 
     29 int main()
     30 {
     31     pthread_t ptThread1;
     32     size_t* pLoops = new size_t(10);
     33     int nRet = pthread_create(&ptThread1, 0, start_routine, (void*)pLoops);
     34     if (0 != nRet)
     35         cerr << endl << "create thread error!" << endl;
     36     else
     37         cerr << endl << "create thread successfully, return value code is " << nRet 
     38             << endl << "thread ID is " << ptThread1 << endl;
     39 
     40     if (0 == nRet)
     41     {
     42         cout << endl << "wait for thread " << ptThread1 << endl;
     43         void* pRetVal = 0;
     44         int nJoinRet = pthread_join(ptThread1, (void**)&pRetVal);
     45         cout << endl << "thread " << ptThread1 << " finished !" << endl;
     46         cout << "thread return value is " << (char*)pRetVal << endl;
     47     }
     48     cout << endl;
     49 
     50     delete pLoops;
     51     pLoops = 0;
     52 
     53     system("ls");
     54 
     55     return 0;
     56 }

     

     

    执行结果

     

     

     PS: 注意可能需要在g++编译参数上加上  -lpthread

      

     

     

  • 相关阅读:
    [转]Request Control Introduce
    [转]How to set the control word of FPU in delphi
    Delphi消息分发机制
    Delphi Handle Exception
    python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算
    如何在Linux下实现50万并发
    转载 google hack
    Linux 网卡如何支持TSO GSO指南
    收藏:网口协商
    AVR地址空间
  • 原文地址:https://www.cnblogs.com/cuish/p/4125443.html
Copyright © 2011-2022 走看看