我正在研究多线程应用程序。 我使用互斥锁进行同步。
我想了解等待线程如何知道另一个线程锁定的共享资源现在已解锁?
我需要在" MUTEX"的情况下理解上述内容。的使用。
答案 0 :(得分:0)
如果全局定义,则进程中的所有线程共享一个信号量。
假设我们有一个writeLogMessage(char *)函数,它打开一个文件并写入给定的String。从多个线程调用此方法将导致不必要的(和不可预测的行为)。因此,您可以编写一个线程安全的包装函数,等待其他线程释放共享资源(在本例中为日志文件)。
sem_t log_mutex;
void writeLogTS(char *logmsg)
{
sem_wait(&log_mutex); //suspend the thread if another thread is currently writing to the log file
writeLogMessage(logmsg);
sem_wait(&log_mutex); //post the mutex semaphore
}
如果信号量大于0,函数sem_wait
将减少信号量的值。但是,如果log_mutex
的值为0,sem_wait
将暂停当前线程的执行直到价值再次增加。增加值由sem_wait
完成。
即如果信号量的值大于0,则其他线程知道共享资源再次可用。
编辑:要充当互斥锁,必须在线程启动之前初始化信号量log_mutex,如下所示:sem_init(&log_mutex, 0, 1);
第二个参数为0以保证线程之间共享信号量,第三个参数是初始值。参看http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_init.html