如果我有2个线程Thread1和Thread2,但是Thread2将使用Thread1完成时执行的一些数据。是否有一种方法让Thread2等待Thread1完成然后获取数据?
答案 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);