2017-03-18 56 views
0

我的意思是编写一个程序,该程序需要2个不同的命令行选项,并使用信号量将输出从“第一个”切换到“下一个”。更详细 -信号量执行的问题

•程序与不同的命令行选项

progName randNumber fRunSeed "F" & progName randNumber nRunSeed "N" & 

•F =首先运行,N =下次运行
•每个运行是指来产生随机数的randNum量,但COUTS运行两次每个随机数之后的一行。
•使用信号量在F运行和N运行之间交替使用cout。 (F为第一个)

输出应包含运行(F或N),进程ID和随机数。

到目前为止我已经写好了头文件,并对一些实际的代码进行了处理。但是我不知道在哪里实际实现信号量......我的确了解信号量的用途,并且这个程序并没有很好地利用它,但这正是我想要使用的。

有人可以看看我的代码,并指导我在正确的方向插入信号量,或告诉我该怎么做?

感谢您所有的帮助 - 代码如下

我的头:

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的正确方法,但正如我所说的,现在只是一个粗略的草案。

谢谢任何​​能够帮助我的人。

+0

在这个上下文中将信号量想象成一个从进程到进程传递的标记,以便现在象征“我拥有输出流”。在这种情况下,每个进程必须产生并刷新输出,然后安全地遵循一些将令牌传递到另一个进程的协议。您应该在生成每个输出行之前获取()或unique_lock信号量,并且在您的进程使用输出流之后释放()它(或销毁unique_lock)。 –

+0

@ArtYerkes对不起,在这里我的无知,但在条款或我的代码,让我们说我想创建信号量,所以我做信号量信号量(101,2)。这应该会变成并创建2个信号量。那是我需要的吗?或者一个足够?我写的代码适合哪里(不包括头文件)? – thanksForHelp

+0

我的阅读是,你只需要1个信号量。显然你需要创建一个信号量对象,然后才能使用它:-) –

回答

0

以下是我认为你可以做你的代码 -

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是在我的代码微不足道。