Linux系统多进程并发信号量互斥机制
相关知识
- 相关函数内容
Linux系统信号量控制
实现代码
- Process1.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/wait.h>
using namespace std;
const int TIMES = 5;
const int DELAY = 5;
const int KEY = 2048;
union Semaphore {
int value;
semid_ds *buffer;
unsigned short *array;
seminfo *infomation;
};
static int semaphoreID = 0;
static bool initializeSemaphoreValue() {
Semaphore semaphoreUnion;
semaphoreUnion.value = 1;
return semctl(semaphoreID, 0, SETVAL, semaphoreUnion) == -1 ? false : true;
}
static bool semaphoreP() {
sembuf semaphoreBuffer;
semaphoreBuffer.sem_num = 0;
semaphoreBuffer.sem_op = -1;
semaphoreBuffer.sem_flg = SEM_UNDO;
return semop(semaphoreID, &semaphoreBuffer, 1) == -1 ? false : true;
}
static bool semaphoreV() {
sembuf semaphoreBuffer;
semaphoreBuffer.sem_num = 0;
semaphoreBuffer.sem_op = 1;
semaphoreBuffer.sem_flg = SEM_UNDO;
return semop(semaphoreID, &semaphoreBuffer, 1) == -1 ? false : true;
}
static void deleteSemaphoreSet() {
Semaphore semaphoreUnion;
if (semctl(semaphoreID, 0, IPC_RMID, semaphoreUnion) == -1) {
fprintf(stderr, "Failed to delete semaphore\n");
}
}
int main(int argc, char const *argv[])
{
if ((semaphoreID = semget((key_t) KEY, 1, 0666 | IPC_CREAT)) == -1) {
fprintf(stderr, "Create semaphore set failed!\n");
abort();
}
if (!initializeSemaphoreValue()) {
fprintf(stderr, "Initialize semaphore failed!\n");
abort();
}
srand((unsigned)getpid());
string message = "Process1";
for (int i = 0; i < TIMES; i++) {
if (!semaphoreP()) {
printf("Semaphore P failed!\n");
abort();
}
cout << message <<endl;
fflush(stdout);
sleep(rand() % DELAY);
if (!semaphoreV()) {
printf("Semaphore V failed!\n");
abort();
}
}
return 0;
}
- Process2.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/wait.h>
using namespace std;
const int TIMES = 5;
const int DELAY = 5;
const int KEY = 2048;
union Semaphore {
int value;
semid_ds *buffer;
unsigned short *array;
seminfo *infomation;
};
static int semaphoreID = 0;
static bool initializeSemaphoreValue() {
Semaphore semaphoreUnion;
semaphoreUnion.value = 1;
return semctl(semaphoreID, 0, SETVAL, semaphoreUnion) == -1 ? false : true;
}
static bool semaphoreP() {
sembuf semaphoreBuffer;
semaphoreBuffer.sem_num = 0;
semaphoreBuffer.sem_op = -1;
semaphoreBuffer.sem_flg = SEM_UNDO;
return semop(semaphoreID, &semaphoreBuffer, 1) == -1 ? false : true;
}
static bool semaphoreV() {
sembuf semaphoreBuffer;
semaphoreBuffer.sem_num = 0;
semaphoreBuffer.sem_op = 1;
semaphoreBuffer.sem_flg = SEM_UNDO;
return semop(semaphoreID, &semaphoreBuffer, 1) == -1 ? false : true;
}
static void deleteSemaphoreSet() {
Semaphore semaphoreUnion;
if (semctl(semaphoreID, 0, IPC_RMID, semaphoreUnion) == -1) {
fprintf(stderr, "Failed to delete semaphore\n");
}
}
int main(int argc, char const *argv[])
{
if ((semaphoreID = semget((key_t) KEY, 1, 0666 | IPC_CREAT)) == -1) {
fprintf(stderr, "Create semaphore set failed!\n");
abort();
}
if (!initializeSemaphoreValue()) {
fprintf(stderr, "Initialize semaphore failed!\n");
abort();
}
srand((unsigned)getpid());
string message = "Process2";
usleep(100);
for (int i = 0; i < TIMES; i++) {
if (!semaphoreP()) {
printf("Semaphore P failed!\n");
abort();
}
cout << message <<endl;
fflush(stdout);
sleep(rand() % DELAY);
if (!semaphoreV()) {
printf("Semaphore V failed!\n");
abort();
}
}
return 0;
}
输出结果
Process1
Process2
Process1
Process2
Process1
Process2
Process1
Process2
Process1
Process2
编译
上述实现使用了两个进程,而不是利用一个父进程再创建另一个子进程
g++ Process1.cpp -o Process1
g++ Process2.cpp -o Process2
./Process1 & ./Process2
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!