#include<pthread.h> #include<stdio.h> #include<unistd.h> #include<string.h> #define MAX 10 pthread_t thread[2]; pthread_mutex_t mut; int number = 0; int i; void* thread1( void *param ) { printf( "thread1: I'm thread 1\n " ); for( i = 0; i < MAX; i++ ) { printf( "thread1: number = %d\n", number ); pthread_mutex_lock( &mut ); ++number; pthread_mutex_unlock( &mut ); sleep( 2 ); } printf( "thread1: 主函数等我完成任务吗? \n " ); pthread_exit( NULL ); return ( void* )0; } void* thread2( void* param ) { printf( "thread2: I'm thread 2\n" ); for( i = 0; i < MAX; i++ ) { printf( "thread2: number = %d\n", number ); pthread_mutex_lock( &mut ); ++number; pthread_mutex_unlock( &mut ); sleep( 3 ); } printf( "thread2: 主函数在等我完成任务吗? \n" ); pthread_exit( NULL ); return ( void* )0; } void thread_create( void ) { int temp; memset( &thread, 0, sizeof( thread ) ); // 创建线程1 if( ( temp = pthread_create( &thread[0], NULL, thread1, NULL ) ) != 0 ) { printf( "线程1创建失败!\n" ); } else { printf( "线程1被创建\n" ); } // 创建线程2 if( ( temp = pthread_create( &thread[1], NULL, thread2, NULL ) ) != 0 ) { printf( "线程2创建失败!\n" ); } else { printf( "线程2被创建\n" ); } } void thread_wait( void ) { // 主函数等待线程1结束 if ( thread[0] != 0 ) { pthread_join( thread[0], NULL ); printf( "线程1已经结束\n" ); } // 主函数等待线程2结束 if ( thread[1] != 0 ) { pthread_join( thread[1], NULL ); printf( "线程2已经结束\n" ); } } int main() { // 初始化互斥锁 pthread_mutex_init( &mut, NULL ); printf( "我是main函数,正在创建线程...\n" ); thread_create(); printf( "我是主函数,正在等待线程完成任务...\n" ); thread_wait(); printf( "main函数已退出\n" ); return 0; }
// main output1
我是main函数,正在创建线程... 线程1被创建 线程2被创建 我是主函数,正在等待线程完成任务... thread1: I'm thread 1 thread2: I'm thread 2 thread1: number = 0 thread2: number = 0 thread1: number = 2 thread2: number = 3 thread1: number = 4 thread2: number = 5 thread1: number = 6 thread1: number = 7 thread2: number = 8 thread1: number = 9 thread2: number = 10 thread1: 主函数等我完成任务吗? 线程1已经结束 thread2: 主函数在等我完成任务吗? 线程2已经结束 main函数已退出
// main output2
我是main函数,正在创建线程... 线程1被创建 线程2被创建 我是主函数,正在等待线程完成任务... thread1: I'm thread 1 thread1: number = 0 thread2: I'm thread 2 thread2: number = 1 thread1: number = 2 thread2: number = 3 thread1: number = 4 thread2: number = 5 thread1: number = 6 thread1: number = 7 thread2: number = 8 thread1: number = 9 thread2: number = 10 thread1: 主函数等我完成任务吗? 线程1已经结束 thread2: 主函数在等我完成任务吗? 线程2已经结束 main函数已退出
g++编译命令如下: g++ -lpthread -o helloworld.out helloworld.cpp
问题:两个线程共同完成任务,但是对于共享变量 i
没有互斥加锁操作,所以以上多线程程序还是存在问题的!
为了达到兼容可移植的目的,POSIX给出了C语言下的多线程编程库 pthread,具体的学习资料请参考一下链接
http://blog.csdn.net/future_fighter/article/details/3865071
http://blog.csdn.net/sunboy_2050/article/details/5921003
http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html