同步模板
使用信号量实现同步时,需要将信号量的初值设置为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的同步关系。
代码语言:javascript 代码运行次数:0
#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <thread>
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;
}执行结果:

互斥模板
互斥是对临界资源的保护,所以互斥只需要在临界区之前和之后分别进行加锁和解锁。需要注意的是,用信号量充当互斥锁实现互斥的时候,信号量的初值应设置为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 <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <thread>
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;
}执行结果:

以上就是Linux 信号量实现同步,实现互斥的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号