信号量实现的问题
Trouble with semaphore implementation
我打算编写一个程序,该程序采用 2 个不同的命令行选项并使用信号量将输出从 "First" 交替为 "Next"。更多详情 -
• 使用不同的命令行选项对 运行s 编程两次
progName randNumber fRunSeed "F" & progName randNumber nRunSeed "N" &
• F = 第一个 运行,N = 下一个 运行
• 每个运行 用于生成randNum 数量的随机数,但在每个随机数后添加一行。
• 使用信号量在F 运行 和N 运行 之间交替调用。 (F 是第一个)
输出应包括 运行(F 或 N)、进程 ID 和随机数。
到目前为止,我已经编写了 header 文件,并进行了一些实际的代码处理。但是我不知道在哪里实际实现信号量...我确实了解信号量的用途,并且该程序并没有真正很好地利用它,但这正是我要使用的。
有人可以查看我的代码并指导我正确插入信号量的方向,或者告诉我如何插入吗?
感谢您的所有帮助 -- 代码如下
我的header:
union semun {
int val;
struct semid_ds *buf;
ushort *array;
};
class Semaphore {
private:
const unsigned int SemCount;
int SemID;
public:
Semaphore (key_t key, int howManySemaphoresToCreate);
void Init (int SemaphoreNumber, int Value);
int ReadValue (int SemaphoreNumber);
// Decrease the value of a semaphore, semaphoreNumber, by 1
void Wait (int SemaphoreNumber);
// Increase the value of a semaphore, semaphoreNumber, by 1.
void Signal (int SemaphoreNumber);
// Remove the semaphore group.
void Destroy( );
};
以及我编写的用于处理数据的代码。我不知道在哪里插入信号量,所以现在实际的代码是一个粗略的草图。
int main(int argc, char *argv[]){
int firstSeed = atoi(argv[2]);
int nextSeed = atoi(argv[2]);
int numRandNums = atoi(argv[1]);
if(argv[3] == "F"){
srand(firstSeed);
for(int i = 0; i < numRandNums; i++){
cout << "F: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
else if(argv[3] == "N"){
srand(nextSeed);
for(int j = 0; j < numRandNums; j++){
cout << "N: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
}
我知道这个网站不是让人为你完成你的工作,但在这一点上我不了解信号量的实际实现,虽然我已经阅读了很多关于它们的内容但找不到足够相似的例子我需要做些什么才能真正看到相似之处。另外,我认为 getpid()
不是获取信号量进程 ID 的正确方法,但正如我所说,现在只是一个粗略的草稿。
感谢任何可以帮助我的人。
这是我认为您可以在代码中添加信号量的方法-
int main(int argc, char *argv[]){
//two semaphores to check if it is time to ru==do first run or next run
Semaphore firstRun=0,nextRun=0;
int firstSeed = atoi(argv[2]);
int nextSeed = atoi(argv[2]);
int numRandNums = atoi(argv[1]);
//Now the program is ready for first run
firstRun.signal();
//the following code is only executed when we have signal in firstRun so the wait function is used
firstRun.wait();
if(argv[3] == "F"){
srand(firstSeed);
for(int i = 0; i < numRandNums; i++){
cout << "F: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
//First Run has been done so generate signal for second
nextRun.signal();
}
//similarly a wait on nextRun to ensure it executes after firt run is finished
nextRun.wait();
else if(argv[3] == "N"){
srand(nextSeed);
for(int j = 0; j < numRandNums; j++){
cout << "N: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
}
或者你只能使用一个信号量 nextRun
,因为我认为 firstRun
在我的代码中的使用是微不足道的。
我打算编写一个程序,该程序采用 2 个不同的命令行选项并使用信号量将输出从 "First" 交替为 "Next"。更多详情 -
• 使用不同的命令行选项对 运行s 编程两次
progName randNumber fRunSeed "F" & progName randNumber nRunSeed "N" &
• F = 第一个 运行,N = 下一个 运行
• 每个运行 用于生成randNum 数量的随机数,但在每个随机数后添加一行。
• 使用信号量在F 运行 和N 运行 之间交替调用。 (F 是第一个)
输出应包括 运行(F 或 N)、进程 ID 和随机数。
到目前为止,我已经编写了 header 文件,并进行了一些实际的代码处理。但是我不知道在哪里实际实现信号量...我确实了解信号量的用途,并且该程序并没有真正很好地利用它,但这正是我要使用的。
有人可以查看我的代码并指导我正确插入信号量的方向,或者告诉我如何插入吗?
感谢您的所有帮助 -- 代码如下
我的header:
union semun {
int val;
struct semid_ds *buf;
ushort *array;
};
class Semaphore {
private:
const unsigned int SemCount;
int SemID;
public:
Semaphore (key_t key, int howManySemaphoresToCreate);
void Init (int SemaphoreNumber, int Value);
int ReadValue (int SemaphoreNumber);
// Decrease the value of a semaphore, semaphoreNumber, by 1
void Wait (int SemaphoreNumber);
// Increase the value of a semaphore, semaphoreNumber, by 1.
void Signal (int SemaphoreNumber);
// Remove the semaphore group.
void Destroy( );
};
以及我编写的用于处理数据的代码。我不知道在哪里插入信号量,所以现在实际的代码是一个粗略的草图。
int main(int argc, char *argv[]){
int firstSeed = atoi(argv[2]);
int nextSeed = atoi(argv[2]);
int numRandNums = atoi(argv[1]);
if(argv[3] == "F"){
srand(firstSeed);
for(int i = 0; i < numRandNums; i++){
cout << "F: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
else if(argv[3] == "N"){
srand(nextSeed);
for(int j = 0; j < numRandNums; j++){
cout << "N: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
}
我知道这个网站不是让人为你完成你的工作,但在这一点上我不了解信号量的实际实现,虽然我已经阅读了很多关于它们的内容但找不到足够相似的例子我需要做些什么才能真正看到相似之处。另外,我认为 getpid()
不是获取信号量进程 ID 的正确方法,但正如我所说,现在只是一个粗略的草稿。
感谢任何可以帮助我的人。
这是我认为您可以在代码中添加信号量的方法-
int main(int argc, char *argv[]){
//two semaphores to check if it is time to ru==do first run or next run
Semaphore firstRun=0,nextRun=0;
int firstSeed = atoi(argv[2]);
int nextSeed = atoi(argv[2]);
int numRandNums = atoi(argv[1]);
//Now the program is ready for first run
firstRun.signal();
//the following code is only executed when we have signal in firstRun so the wait function is used
firstRun.wait();
if(argv[3] == "F"){
srand(firstSeed);
for(int i = 0; i < numRandNums; i++){
cout << "F: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
//First Run has been done so generate signal for second
nextRun.signal();
}
//similarly a wait on nextRun to ensure it executes after firt run is finished
nextRun.wait();
else if(argv[3] == "N"){
srand(nextSeed);
for(int j = 0; j < numRandNums; j++){
cout << "N: " << "ID: " << getpid() << " Num: " << rand() << endl;
}
}
}
或者你只能使用一个信号量 nextRun
,因为我认为 firstRun
在我的代码中的使用是微不足道的。