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

      

     

     

  • 相关阅读:
    sql server该账户当前被锁定,所以用户'sa'登录失败。系统管理员无法将该账户解锁。(Microsoft SQL Server,错误:18486)
    windows server常用操作
    sql server2005直接会话运行成功,但在作业执行报错
    sql server xp_readerrorlog引起的CPU爆满100%
    sql server错误日志
    (13)python网络编程,python Socket
    tcp/ip
    (12)python异常处理,python中的 try except
    典型分布式系统分析:Dynamo
    c++ set与unordered set的区别
  • 原文地址:https://www.cnblogs.com/cuish/p/4125443.html
Copyright © 2011-2022 走看看