posix threads c ++的问题

时间:2011-02-08 14:10:44

标签: multithreading synchronization pthreads

如果我有2个线程Thread1和Thread2,但是Thread2将使用Thread1完成时执行的一些数据。是否有一种方法让Thread2等待Thread1完成然后获取数据?

4 个答案:

答案 0 :(得分:1)

如果您需要来自thread1的数据而不仅仅是简单的锁定以防止并发访问,那么您应该使用信号量:

   #include <semaphore.h>

   int sem_init(sem_t *sem, int pshared, unsigned int value);

   int sem_post(sem_t *sem);

   int sem_wait(sem_t *sem);

   int sem_trywait(sem_t *sem);

   int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

   int sem_destroy(sem_t *sem);

主程序在启动线程之前运行sem_init。线程1运行sem_post以指示它已完成。线程2使用sem_wait来确保线程1在启动之前完成。

答案 1 :(得分:1)

一种方法是使用条件变量: 例如:

pthread_mutex_t mx; 
pthead_cond_t cond; 

void first_f(void *) { 
...
    pthread_mutex_lock(&mx) 

// do something in first function
// the second function is waiting

    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(&mx); 
  } 
  return NULL; 
} 

void second_f(void *) { 
...
    pthread_mutex_lock(&mx)    
    pthread_cond_wait(&cond, &mx); 

// waiting for first function until we catch a signal

    pthread_mutex_unlock(&mx); 
  } 
  return NULL; 
} 

第二种方法是使用两个信号量。第一个sem设置为1,第二个设置为零。当第一个函数完成时,它将第一个sem设置为0,将第二个sem设置为1.第二个函数等待,直到第二个信号量被第一个函数设置为1并且有效。

答案 2 :(得分:0)

它被称为互斥体。 pthreads调用pthread_mutex,你应该在文档中找到它们。

答案 3 :(得分:0)

是的,您可以使用互斥锁来“保护”有问题的数据:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abs_timeout);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);