等待线程如何知道共享资源被另一个线程解锁?

时间:2014-05-04 12:34:01

标签: linux multithreading pthreads

我正在研究多线程应用程序。 我使用互斥锁进行同步。

我想了解等待线程如何知道另一个线程锁定的共享资源现在已解锁?

我需要在" MUTEX"的情况下理解上述内容。的使用。

1 个答案:

答案 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