我在c中创建了两个线程。我想通过每个线程执行两个单独的函数。如何使一个特定线程首先执行。
#include <stdio.h>
#include <pthread.h>
void* function_1(void* p)
{
// statements
}
void* function_2(void* p)
{
// statements
}
int main(void)
{
pthread_t id1;
pthread_t id2;
pthread_create(&id1, NULL, function_1, NULL);
pthread_create(&id2, NULL, function_2, NULL);
pthread_exit(NULL);
}
程序启动时,如何使函数_1在函数_2之前执行?
将主函数更改为如下所示:
int main(void) {
function_1(NULL);
function_2(NULL);
}
不开玩笑!如果function_2()
在function_1()
完成之前不启动很重要,那么就是这样做的;实现这一点的最好方法是在同一个线程中完成所有的事情。
线程do需要";"同步";有时会相互关联(例如,在生产者将某个东西放入队列之前,消费者从队列中取出某个东西是没有任何意义的(,但如果你的线程没有将大部分时间花在彼此独立地工作上,那么你可能不会从使用多个线程中获得任何好处。
@SolomonSlow已经说明了显而易见的问题。如果你想按顺序执行,为什么要有几个线程?
半身像只是为了完整:
pthread_create(&id1, NULL, function_1, NULL);
pthread_join(id1, NULL);
pthread_create(&id2, NULL, function_2, NULL);
如其他答案中所述,您的问题很可能是XY问题。在这种情况下,最好不要使用多线程,而是使用单个线程。
如果您真的想使用线程,那么,正如在其他答案中所述,使用pthread_join
可能是您在问题中发布的代码的最佳解决方案。
但是,如果您只想确保在另一个线程完成执行function_1
之前,function_2
中的代码不会被执行,并且不想等待执行function_1
的线程终止(例如,因为线程应该在调用function_1
之后做其他事情(,然后,我建议您使用pthreads条件变量和pthreadsmutex来同步线程。
下面的示例将代码添加到function_1
的末尾,以向另一个线程发出信号,表明它现在可以继续执行function_2
。它还将代码添加到等待发送该信号的function_2
的开始。
以下是示例:
#include <stdio.h>
#include <pthread.h>
struct sync_data
{
pthread_mutex_t mutex;
volatile int predicate;
pthread_cond_t cond;
};
void* function_1(void* p)
{
// the function's main code goes here
//signal to other thread that it may now proceed
struct sync_data *psd = p;
pthread_mutex_lock( &psd->mutex );
psd->predicate = 1;
pthread_mutex_unlock( &psd->mutex );
pthread_cond_signal( &psd->cond );
}
void* function_2(void* p)
{
//wait for signal from other thread
struct sync_data *psd = p;
pthread_mutex_lock( &psd->mutex );
while ( !psd->predicate )
pthread_cond_wait( &psd->cond, &psd->mutex );
pthread_mutex_unlock( &psd->mutex );
// the function's main code goes here
}
int main(void)
{
struct sync_data sd;
pthread_t id1;
pthread_t id2;
//init sync_data struct members
pthread_mutex_init( &sd.mutex, NULL );
sd.predicate = 0;
pthread_cond_init( &sd.cond, NULL );
//create and start both threads
pthread_create( &id1, NULL, function_1, &sd );
pthread_create( &id2, NULL, function_2, &sd );
//wait for all threads to finish
pthread_join(id1, NULL);
pthread_join(id2, NULL);
//cleanup
pthread_mutex_destroy( &sd.mutex );
pthread_cond_destroy( &sd.cond );
}