c++多线程编程

一直对多线程编程这一块很陌生,决定花一点时间整理一下 。
os:ubuntu 10.04 c++
1.最基础,进程同时创建5个线程,各自调用同一个函数
#include <IOStream>#include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; #define NUM_THREADS 5 //线程数 void* say_hello( void* args ){ cout << "hello..." << endl;} //函数返回的是函数指针,便于后面作为参数int main(){ pthread_t tids[NUM_THREADS]; //线程id for( int i = 0; i < NUM_THREADS; ++i ) { int ret = pthread_create( &tids[i], NULL, say_hello, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数 if( ret != 0 ) //创建线程成功返回0 { cout << "pthread_create error:error_code=" << ret << endl; } } pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态}输入命令:g++ -o muti_thread_test_1 muti_thread_test_1.cpp -lpthread
注意:
1)此为c++程序,故用g++来编译生成可执行文件,并且要调用处理多线程操作相关的静态链接库文件pthread 。
2)-lpthread 编译选项到位置可任意,如g++ -lpthread -o muti_thread_test_1 muti_thread_test_1.cpp
3)注意gcc和g++的区别,转到此文:点击打开链接
测试结果:
wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_1hello...hello...hello...hello... hello...wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_1hello...hello...hello... hello...hello...权协议,转载请附上原文出处链接及本声明 。原文链接:https://blog.csdn.net/hitwengqi/article/details/8015646wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_1hello...hello...hello...hello...hello...可知,两次运行的结果会有差别,这不是多线程的特点吧?这显然没有同步?还有待进一步探索...
多线程的运行是混乱的,混乱就是正常?
2.线程调用到函数在一个类中,那必须将该函数声明为静态函数函数
因为静态成员函数属于静态全局区,线程可以共享这个区域,故可以各自调用 。
#include <iostream>#include <pthread.h> using namespace std; #define NUM_THREADS 5 class Hello{public: static void* say_hello( void* args ) { cout << "hello..." << endl; }};int main(){ pthread_t tids[NUM_THREADS]; for( int i = 0; i < NUM_THREADS; ++i ) { int ret = pthread_create( &tids[i], NULL, Hello::say_hello, NULL ); if( ret != 0 ) { cout << "pthread_create error:error_code" << ret << endl; } } pthread_exit( NULL );}测试结果
wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_2hello...hello...hello...hello...hello...wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_2hello...hello...hello...hello...hello...3.如何在线程调用函数时传入参数呢?
先看下面修改的代码,传入线程编号作为参数:
#include <iostream>#include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; #define NUM_THREADS 5 //线程数 void* say_hello( void* args ){ int i = *( (int*)args ); //对传入的参数进行强制类型转换,由无类型指针转变为整形指针,再用*读取其指向到内容 cout << "hello in " << i << endl;} //函数返回的是函数指针,便于后面作为参数int main(){ pthread_t tids[NUM_THREADS]; //线程id cout << "hello in main.." << endl; for( int i = 0; i < NUM_THREADS; ++i ) { int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&i ); //传入到参数必须强转为void*类型,即无类型指针,&i表示取i的地址,即指向i的指针 cout << "Current pthread id = " << tids[i] << endl; //用tids数组打印创建的进程id信息 if( ret != 0 ) //创建线程成功返回0 { cout << "pthread_create error:error_code=" << ret << endl; } } pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态}测试结果:
wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_3hello in main..Current pthread id = 3078458224Current pthread id = 3070065520hello in hello in 21Current pthread id = hello in 23061672816Current pthread id = 3053280112hello in 4Current pthread id = hello in 43044887408显然不是想要的结果,调用顺序很乱,这是为什么呢?
这是因为多线程到缘故,主进程还没开始对i赋值,线程已经开始跑了...?
修改代码如下:
#include <iostream>#include <pthread.h> //多线程相关操作头文件,可移植众多平台 using namespace std; #define NUM_THREADS 5 //线程数 void* say_hello( void* args ){ cout << "hello in thread " << *( (int *)args ) << endl;} //函数返回的是函数指针,便于后面作为参数int main(){ pthread_t tids[NUM_THREADS]; //线程id int indexes[NUM_THREADS]; //用来保存i的值避免被修改 for( int i = 0; i < NUM_THREADS; ++i ) { indexes[i] = i; int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&(indexes[i]) ); if( ret != 0 ) //创建线程成功返回0 { cout << "pthread_create error:error_code=" << ret << endl; } } for( int i = 0; i < NUM_THREADS; ++i ) pthread_join( tids[i], NULL ); //pthread_join用来等待一个线程的结束,是一个线程阻塞的函数}


推荐阅读