#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock;
int ticketcount=5;
void* salewinds1(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window1 start %d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale ticket finish:%d\n",ticketcount);
}else
{
pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
pthread_exit(NULL);
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
void* salewinds2(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window2 start:%d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale finish:%d\n",ticketcount);
}else
{
pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
pthread_exit(NULL);
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
int main(int argc,const char* argv[])
{
pthread_t thd1;
pthread_t thd2;
int val1=1;
int val2=2;
pthread_mutex_init(&lock,NULL);
pthread_create(&thd1,NULL,salewinds1,NULL);
pthread_create(&thd2,NULL,salewinds2,NULL);
pthread_join(thd1,(void**)&val1);
pthread_join(thd2,(void**)&val2);
printf("val1:%d....val2:%d\n",val1,val2);
pthread_mutex_destroy(&lock);
return 0;
}
如果一个线程被加锁,一定要在线程退出前解锁,否则不解锁的线程不会执行pthread_exit,除非使用exit直接终止进程。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock;
int ticketcount=5;
void* salewinds1(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window1 start %d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale ticket finish:%d\n",ticketcount);
}else
{
pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
pthread_exit(NULL);
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
void* salewinds2(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window2 start:%d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale finish:%d\n",ticketcount);
}else
{
//pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
//pthread_exit(NULL);
exit(1);
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
int main(int argc,const char* argv[])
{
pthread_t thd1;
pthread_t thd2;
int val1=1;
int val2=2;
pthread_mutex_init(&lock,NULL);
pthread_create(&thd1,NULL,salewinds1,NULL);
pthread_create(&thd2,NULL,salewinds2,NULL);
pthread_join(thd1,(void**)&val1);
pthread_join(thd2,(void**)&val2);
printf("val1:%d....val2:%d\n",val1,val2);
pthread_mutex_destroy(&lock);
return 0;
}
可以正常退出。
</pre><pre name="code" class="cpp">
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock;
int ticketcount=5;
void* salewinds1(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window1 start %d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale ticket finish:%d\n",ticketcount);
}else
{
//pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
//pthread_exit(NULL);
//exit(1);
return NULL;
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
void* salewinds2(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window2 start:%d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale finish:%d\n",ticketcount);
}else
{
//pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
//pthread_exit(NULL);
//exit(1);
return NULL;
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
int main(int argc,const char* argv[])
{
pthread_t thd1;
pthread_t thd2;
int val1=1;
int val2=2;
pthread_mutex_init(&lock,NULL);
pthread_create(&thd1,NULL,salewinds1,NULL);
pthread_create(&thd2,NULL,salewinds2,NULL);
pthread_join(thd1,(void**)&val1);
pthread_join(thd2,(void**)&val2);
printf("val1:%d....val2:%d\n",val1,val2);
pthread_mutex_destroy(&lock);
return 0;
}
不可以正常退出
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock;
int ticketcount=5;
void* salewinds1(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window1 start %d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale ticket finish:%d\n",ticketcount);
}else
{
pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
//pthread_exit(NULL);
//exit(1);
return NULL;
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
void* salewinds2(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("window2 start:%d\n",ticketcount);
sleep(1);
ticketcount--;
printf("sale finish:%d\n",ticketcount);
}else
{
//pthread_mutex_unlock(&lock);//这句如果不加会造成程序死锁
//pthread_exit(NULL);
//exit(1);
return NULL;
}
pthread_mutex_unlock(&lock);
sleep(1);
}
return NULL;
}
int main(int argc,const char* argv[])
{
pthread_t thd1;
pthread_t thd2;
int val1=1;
int val2=2;
pthread_mutex_init(&lock,NULL);
pthread_create(&thd1,NULL,salewinds1,NULL);
pthread_create(&thd2,NULL,salewinds2,NULL);
pthread_join(thd1,(void**)&val1);
pthread_join(thd2,(void**)&val2);
printf("val1:%d....val2:%d\n",val1,val2);
pthread_mutex_destroy(&lock);
return 0;
}
可以退出,有时也可能不会退出,跟加锁的位置有关