一. 实现同步
同步模板
使用信号量实现同步时,需要将信号量的初值设置为0。以下是实现同步的模板:
semaphore s = 0;
p1() {
p(s);
// 具体的代码
}
p2() {
// 具体的代码
v(s);
}假设p1先执行,执行到p(s),s-=1,此时s=-1,然后p2执行完毕。CPU调度执行p1,p1首先p(s),s-=1,s=0,然后执行具体的代码。同样也达到了先执行p2后执行p1的同步关系。
二. Linux下信号量实现同步,线程2先执行输出"hello",线程1后执行输出"world\n"的功能
代码语言:javascript 代码运行次数:0
#include#include #include #include #include using namespace std; int x = 10; int main() { sem_t sem; sem_init(&sem, 0, 0); thread t1([&](){ sem_wait(&sem); cout << "world\n"; }); thread t2([&](){ cout << "hello"; sem_post(&sem); }); t1.join(); t2.join(); sem_destroy(&sem); return 0; }
执行结果:

三. 实现互斥
互斥模板
网趣网上购物系统支持PC电脑版+手机版+APP,数据一站式更新,支持微信支付与支付宝支付接口,是专业的网上商城系统,网趣商城系统支持淘宝数据包导入,实现与淘宝同步更新!支持上传图片水印设置、图片批量上传功能,同时支持订单二次编辑以及多级分类隐藏等实用功能,新版增加商品大图浏览与列表显示功能,使分类浏览更方便,支持最新的支付宝即时到帐接口。
互斥是对临界资源的保护,所以互斥只需要在临界区之前和之后分别进行加锁和解锁。需要注意的是,用信号量充当互斥锁实现互斥的时候,信号量的初值应设置为1,表示临界资源的个数为1。
int x = 10; // 临界资源
semaphore s = 1;
p1() {
p(s);
x++; // 访问临界资源
v(s);
}
p2() {
p(s);
x--; // 访问临界资源
v(s);
}假设p1先执行,p(s),s-=1,s=0,假设此时CPU时间片用完,CPU调度执行p2,p(s),s-=1,s=-1。
代码语言:javascript 代码运行次数:0
#include#include #include #include #include using namespace std; int x = 10; // 临界资源 int main() { sem_t sem; sem_init(&sem, 0, 1); thread t1([&](){ sem_wait(&sem); x++; cout << "Thread 1: x = " << x << endl; sem_post(&sem); }); thread t2([&](){ sem_wait(&sem); x--; cout << "Thread 2: x = " << x << endl; sem_post(&sem); }); t1.join(); t2.join(); sem_destroy(&sem); return 0; }
执行结果:










