实现信号量

时间:2017-03-27 02:04:20

标签: c++ multithreading semaphore

我在下面有以下代码。我只希望一半的线程一次进入线程函数。如何创建信号量来阻止其他进程?当线程完成使用该函数时,我将如何解除阻塞先前被阻止的进程?

function register($uname,$umail,$upass)
    {

        $DB_con = null;

try
{
     $DB_con = new PDO("mysql:host=$host;dbname=$dbname", "$username" ,"$password");
     $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
     echo $e->getMessage();
}   



       try
       {
           $new_password = password_hash($upass, PASSWORD_DEFAULT);

           $stmt = $DB_con->prepare("INSERT INTO users(user_name,user_email,user_pass) 
                                                       VALUES(:uname, :umail, :upass)");

           $stmt->bindparam(":uname", $uname);
           $stmt->bindparam(":umail", $umail);
           $stmt->bindparam(":upass", $new_password);            
           $stmt->execute(); 
           return $stmt; 

       }
       catch(PDOException $e)
       {
           echo $e->getMessage();
       }    

    }

1 个答案:

答案 0 :(得分:1)

你能做的是使用计数信号量(而不是二进制信号量)。计数信号量的初始值大于1,允许多个线程调用"等待"在信号量上,并没有实际阻塞这些线程并将其放入信号量队列。

在您的情况下,我要做的是在main函数中初始化一个信号量,初始值为NUM_THREADS / 2。然后我会在threadedFunction的开头插入一行,在那里我做一个等待(信号量)和函数末尾的一行,你做一个信号(信号量)。这样,当一个线程即将退出该函数时,它会发出一个线程,该线程在对信号量调用wait之后被阻塞,并且它允许该线程进入。 希望这会有所帮助。