学习分享
- 1、线程同步
- 2、用信号量进行同步
- 2.1、信号量函数
- 2.2、创建一个信号量
- 2.3、sem_post函数 (解锁)
- 2.4、sem_wait函数 (加锁)
- 2.5、sem_destroy函数
- 2.6、信号量示例
- 3、用互斥量进行同步
- 3.1、互斥量函数数组
- 3.2、互斥量示例
1、线程同步
两个(或多个)线程同时执行时,经常需要访问到公共资源或代码的关键部分,这时就涉及到了线程的同步问题,我们可以通过下面两种方法来更好地控制线程的执行情况和更好地访问代码的关键部分
- 线程信号量
- 线程互斥量
2、用信号量进行同步
“信号量”的作用就象是代码周围的门卫
二进制信号量:一种最简单的一种信号量,只有“0”,“1”两种取值
计数信号量:有更大的取值范围,一般用于希望有限个线程去执行一段给定的代码
2.1、信号量函数
2.2、创建一个信号量
2.3、sem_post函数 (解锁)
2.4、sem_wait函数 (加锁)
2.5、sem_destroy函数
2.6、信号量示例
#include <iostream>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>using namespace std;typedef struct student
{char stuname[20];char sexy[6];
}STU;
STU stu ={0};
sem_t sem ;//定义线程信号量
void* thread_function1(void* arg)
{int num=0;while (1){if(num%2 ==0){sem_wait(&sem)//加锁strcpy(stu.stuname,"张三");strcpy(stu.sexy,"男");sem_post(&sem);//解锁}else{sem_wait(&sem)//加锁strcpy(stu.stuname,"王丽丽");strcpy(stu.sexy,"女");sem_post(&sem);//解锁}num++;}
}
void* thread_function2(void* arg)
{while (1){sem_wait(&sem)//加锁cout << "stu.stuname= "<<stu.stuname << "--stu.sexy--"<<stu.sexy<<endl;sleep(1);sem_post(&sem);//解锁}
}
int main()
{int number=0;sem_init(&sem,0,1);//信号量初始化pthread_t threadid;if (pthread_create(&threadid, NULL, thread_function1, &number) != 0){perror("pthread_create error");}if (pthread_create(&threadid, NULL, thread_function2, &number) != 0){perror("pthread_create error");}while (1){}sem_destroy(&sem);return 0;
}
3、用互斥量进行同步
使用互斥量是实现多线程程序中的同步访问的另一种手段
程序员给某个对象加上一把“锁”,每次只允许一个线程去访问它
如果想对代码关键部分的访问进行控制,你必须在进入这段代码之前锁定一把互斥量,在完成操作后再打开它
3.1、互斥量函数数组
3.2、互斥量示例
#include <iostream>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
using namespace std;typedef struct student
{char stuname[20];char sexy[6];
}STU;
STU stu ={0};
pthread_mutex_t mutex;//定义互斥量
void* thread_function1(void* arg)
{int num=0;while (1){if(num%2 ==0){pthread_mutex_lock(&mutex);//加锁strcpy(stu.stuname,"张三");strcpy(stu.sexy,"男");pthread_mutex_unlock(&mutex);//解锁}else{pthread_mutex_lock(&mutex);//加锁strcpy(stu.stuname,"王丽丽");strcpy(stu.sexy,"女");pthread_mutex_unlock(&mutex);//解锁}num++;}
}
void* thread_function2(void* arg)
{while (1){pthread_mutex_lock(&mutex);//加锁cout << "stu.stuname= "<<stu.stuname << "--stu.sexy--"<<stu.sexy<<endl;sleep(1);pthread_mutex_unlock(&mutex);//解锁}
}
int main()
{int number=0;pthread_mutex_init(&mutex,NULL);//互斥量初始化pthread_t threadid;if (pthread_create(&threadid, NULL, thread_function1, &number) != 0){perror("pthread_create error");}if (pthread_create(&threadid, NULL, thread_function2, &number) != 0){perror("pthread_create error");}while (1){}pthread_mutex_destroy(&mutex);//释放锁对象return 0;
}