加锁与不加锁的对比:
//!>不加锁测试
//!>简单的售票小测试程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
int
g_ticket =10;
//!> 票数目
void * entrance_1( void * arg )
{
while(g_ticket > 0 )
{
printf("线程1售出票: %d \n", g_ticket);
--g_ticket;
sleep( 1);
}
}
void * entrance_2( void * arg )
{
while(g_ticket > 0 )
{
printf("线程2售出票: %d \n", g_ticket);
--g_ticket;
sleep( 1);
}
}
int main( int argc, char ** argv )
{
pthread_t
tid1,tid2;
if(pthread_create( &tid1, NULL, entrance_1, NULL ) !=0 )
{
printf("创建线程1失败...\n");
exit(EXIT_FAILURE );
}
if(pthread_create( &tid2, NULL, entrance_2, NULL ) !=0 )
{
printf("创建线程2失败...\n");
exit(EXIT_FAILURE );
}
pthread_join( tid1, NULL);
//!> 等待...
pthread_join( tid2, NULL);
//!> 等待...
return0;
}
./test
结果:
线程1售出票:10
线程2售出票:10
线程2售出票:8
线程1售出票:8
线程2售出票:6
线程1售出票:5
线程1售出票:4
线程2售出票:4
线程2售出票:2
线程1售出票:2
看看结果就知道售票是不对的!!!
//!>加锁测试
//!>简单的售票小测试程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
int
g_ticket =10;
//!> 票数目
pthread_mutex_t
g_mutex;
void * entrance_1( void * arg )
{
while(g_ticket > 0 )
{
pthread_mutex_lock( &g_mutex);
//!> 加锁
printf("线程1售出票: %d \n", g_ticket);
--g_ticket;
pthread_mutex_unlock( &g_mutex);
//!> 解锁
sleep( 1);
}
}
void * entrance_2( void * arg )
{
while(g_ticket > 0 )
{
pthread_mutex_lock( &g_mutex);
//!> 加锁
printf("线程2售出票: %d \n", g_ticket);
--g_ticket;
pthread_mutex_unlock( &g_mutex);
//!> 解锁
sleep( 1);
}
}
int main( int argc, char ** argv )
{
pthread_t
tid1,tid2;
pthread_mutex_init( &g_mutex, NULL);
//!> 初始化
if(pthread_create( &tid1, NULL, entrance_1, NULL ) !=0 )
{
printf("创建线程1失败...\n");
exit(EXIT_FAILURE );
}
if(pthread_create( &tid2, NULL, entrance_2, NULL ) !=0 )
{
printf("创建线程2失败...\n");
exit(EXIT_FAILURE );
}
pthread_join( tid1, NULL);
//!> 等待...
pthread_join( tid2, NULL);
//!> 等待...
pthread_mutex_destroy( &g_mutex);
//!> 删除互斥灯
return0;
}
./test
结果:
线程1售出票:10
线程2售出票: 9
线程1售出票:8
线程2售出票:7
线程1售出票:6
线程2售出票:5
线程1售出票:4
线程2售出票:3
线程1售出票:2
线程2售出票:1
//!>不加锁测试
//!>简单的售票小测试程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
int
void * entrance_1( void * arg )
{
}
void * entrance_2( void * arg )
{
}
int main( int argc, char ** argv )
{
}
./test
结果:
//!>加锁测试
//!>简单的售票小测试程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
int
pthread_mutex_t
void * entrance_1( void * arg )
{
}
void * entrance_2( void * arg )
{
}
int main( int argc, char ** argv )
{
}
./test
结果: