C++11 thread

Written with StackEdit.

【题目1】

子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码

#include  <thread>  
#include  <iostream>  
#include  <cstdio>  
#include  <mutex>  
#include  <condition_variable>  
using  namespace  std;  
int  flag=10;  
mutex  mu;  
condition_variable  cv;  
  
void  fun(int  x,char  c)  
{  
    for(int  i=0;i<2;i++){  
    unique_lock<mutex>  lock(mu);  
    while(flag!=x)  
    cv.wait(lock);  
    for(int  j=0;j<x;j++){  
        cout  <<  c  <<  ":"  <<j  <<endl;  
    }  
    flag  =  (x==10)?100:10;  
    cv.notify_one();  
    }  
}  
int  main()  
{  
    thread  t1(fun,10,'A');  
    fun(100,'B');  
    t1.join();  
    return  0;  
}

【题目2】

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

#include  <thread>  
#include  <iostream>  
#include  <cstdio>  
#include  <mutex>  
#include  <condition_variable>  
using  namespace  std;  
int  flag=0;  
mutex  mu;  
condition_variable  cv;  
  
void  fun(int  x)  
{  
    for  (int  i=0;i<10;i++)  {  
        unique_lock<mutex>  lock(mu);  
        while  (x!=flag)  
        cv.wait(lock);  
        cout  <<static_cast<char>('A'+x)<<" ";  
        flag  =  (flag+1)%3;  
        cv.notify_all();  
    }  
}  
int  main()  
{  
    thread  t1(fun,1);  
    thread  t2(fun,2);  
    fun(0);  
    t1.join();  
    t2.join();  
    return  0;  
}

[题目三]

// condition_variable example  
#include  <iostream>  // std::cout  
#include  <thread>  // std::thread  
#include  <mutex>  // std::mutex, std::unique_lock  
#include  <condition_variable>  // std::condition_variable  
  
std::mutex  mtx;  
std::condition_variable  cv;  
bool  ready  =  false;  
  
void  print_id(int  id)  {  
    std::unique_lock<std::mutex>  lck(mtx);  
    while  (!ready)  cv.wait(lck);  
    // ...  
    std::cout  <<  "thread "  <<  id  <<  '\n';  
}  
  
void  go()  {  
    std::unique_lock<std::mutex>  lck(mtx);  
    ready  =  true;  
    cv.notify_all();  // 这是重点  
}  
  
int  main()  
{  
    std::thread  threads[10];  
    // spawn 10 threads:  
    for  (int  i  =  0;  i  <  10;  ++i)  
    threads[i]  =  std::thread(print_id,  i);  
      
    std::cout  <<  "10 threads ready to race...\n";  
    go();  // go!  
      
    for  (auto&  th  :  threads)  th.join();  
      
    return  0;  
}

[题目4]

// condition_variable example  
#include  <iostream>  
#include  <chrono>  
#include  <thread>  
#include  <mutex>  
std::timed_mutex  mtx;  
void  fireworks  ()  {  
    while  (!mtx.try_lock_for(std::chrono::milliseconds(200)))  {  
        std::cout  <<  "-";  
    }  
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));  
    std::cout  <<  "*\n";  
    mtx.unlock();  
}  
int  main  ()  
{  
    std::thread  threads[10];  
    for  (int  i=0;  i<10;  ++i)  
    threads[i]  =  std::thread(fireworks);  
    for  (auto&  th  :  threads)  th.join();  
    return  0;  
}

在线测试

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容