直接上示例代码,个人感觉这样学习更快。
示例代码一:不使用互斥锁,直接创建多线程,运行函数。前提是懂得线程创建函数的用法。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex ;
void *print_msg(void *arg){
int i=0;
// pthread_mutex_lock(&mutex);
for(i=0;i<5;i++){
printf("output : %d\n",i);
usleep(100);
}
// pthread_mutex_unlock(&mutex);
}
int main(int argc,char** argv){
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
return 1;
}
运行结果如下:
output : 0
output : 0
output : 1
output : 1
output : 2
output : 2
output : 3
output : 3
output : 4
output : 4
如果把关于锁的注释取消,使用如下代码:
#include<unistd.h>
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex ;
void *print_msg(void *arg){
int i=0;
pthread_mutex_lock(&mutex);
for(i=0;i<5;i++){
printf("output : %d\n",i);
usleep(100);
}
pthread_mutex_unlock(&mutex);
}
int main(int argc,char** argv){
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
return 1;
}
运行结果如下:
output : 0
output : 1
output : 2
output : 3
output : 4
output : 0
output : 1
output : 2
output : 3
output : 4
对比可以知道互斥锁的主要作用是,只保证一个线程执行,当锁摧毁之后,才可以由第二个线程执行。
第二天,又看到了一些关于互斥锁使用的代码,放到这里分享给大家,同样编译的时候 注意使用-lpthread
/*
此代码测试互斥锁的使用,0-100分成两段分别计算。
*/
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
typedef struct ct_sum
{ int sum;
pthread_mutex_t lock;
}ct_sum;
void * add1(void * cnt)
{
pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
int i;
for( i=0;i<50;i++){
(*(ct_sum*)cnt).sum+=i;}
pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
pthread_exit(NULL);
return 0;
}
void * add2(void *cnt)
{
int i;
cnt= (ct_sum*)cnt;
pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
for( i=50;i<101;i++)
{ (*(ct_sum*)cnt).sum+=i;
}
pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
pthread_exit(NULL);
return 0;
}
int main(void)
{ int i;
pthread_t ptid1,ptid2;
int sum=0;
ct_sum cnt;
pthread_mutex_init(&(cnt.lock),NULL);
cnt.sum=0;
pthread_create(&ptid1,NULL,add1,&cnt);
pthread_create(&ptid2,NULL,add2,&cnt);
// pthread_mutex_lock(&(cnt.lock)); 代码原作者有这两句,但是我认为米有必须就注释掉了
// pthread_mutex_unlock(&(cnt.lock));
pthread_join(ptid1,NULL);
pthread_join(ptid2,NULL);
pthread_mutex_destroy(&(cnt.lock));
printf("sum %d\n",cnt.sum);
return 0;
}
这样运行之后的结果就是 sum 5050;
稍作更改之后,我取消函数中的互斥锁,希望可以得到错误的sum值,但是不知道为什么却没有想要的效果,仍然是正确的5050,我怀疑是我加互斥锁的位置不正确。具体代码如下:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
typedef struct ct_sum
{ int sum;
pthread_mutex_t lock;
}ct_sum;
void * add1(void * cnt)
{
// pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
int i;
for( i=0;i<50;i++){
(*(ct_sum*)cnt).sum+=i;}
// pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
pthread_exit(NULL);
return 0;
}
void * add2(void *cnt)
{
int i;
cnt= (ct_sum*)cnt;
// pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
for( i=50;i<101;i++)
{ (*(ct_sum*)cnt).sum+=i;
}
// pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
pthread_exit(NULL);
return 0;
}
int main(void)
{ int i;
pthread_t ptid1,ptid2;
int sum=0;
ct_sum cnt;
// pthread_mutex_init(&(cnt.lock),NULL);
cnt.sum=0;
pthread_create(&ptid2,NULL,add2,&cnt);
pthread_create(&ptid1,NULL,add1,&cnt);
// pthread_mutex_lock(&(cnt.lock));
// pthread_mutex_unlock(&(cnt.lock));
pthread_join(ptid1,NULL);
pthread_join(ptid2,NULL);
pthread_mutex_destroy(&(cnt.lock));
printf("sum %d\n",cnt.sum);
return 0;
}
运行结果之后,仍然为 5050.。。。。。
希望对这方面有了解的朋友,给我留言,指点迷津。