假设有这个整数A
。每次运行func()
时,将A
增加1.并且我用2个线程调用此函数。示例:如果用户输入输入5,则每个线程运行5次,这将生成A = 10
。
这就是我在主线程中所拥有的:
for ( i = 0; i < 5; i++)
{
pthread_create(&thread1, NULL, (void*)func, (void*)args);
pthread_create(&thread2, NULL, (void*)func, (void*)args2);
}
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
我的方式是,如果用户希望每个线程运行5次。我会做一个循环,每次创建&#34; new&#34;线程,实际上是覆盖。我想我们可以说我打了10个帖子,或者我用了pthread_create()
10次。
但我被告知这是错的。应该是我只创建了2个线程,每个线程运行5次。但是我不明白,我怎么能用每个线程调用该函数5次。如果我想要一个函数,我每次都必须使用pthread_create()
,对吗?
无论如何,如果没有循环pthread_create()
5次,我仍然可以使用线程调用func()
5次?
答案 0 :(得分:0)
不,你不可能多次运行one run thread
,因为for n number of thread creation, you have to declare that many no of threads
和线程共享运行它们的进程的地址空间并拥有自己的堆栈来运行线程功能一旦使用pthread_join()
收集返回状态,thread_1
已完成,则无法再次运行。 thread1
。
因此,只有解决方案是创建5 pthread_t
变量或创建array of pthread_t
。
解决方案-1 :
int main()
{
pthread_t thread1,thread2,thread3,thread4,thread5;
pthread_create(&thread1, NULL, (void*)func1, (void*)args1);
pthread_create(&thread2, NULL, (void*)func2, (void*)args2);
pthread_create(&thread3, NULL, (void*)func3, (void*)args3);
pthread_create(&thread4, NULL, (void*)func4, (void*)args4);
pthread_create(&thread5, NULL, (void*)func5, (void*)args5);
//and that many times you should use pthread_join() to avoid undefined behaviour
/*If multiple threads simultaneously try to join with the same thread, the results are undefined. If the thread calling pthread_join() is cancelled,
then the target thread will remain joinable*/
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
...
pthread_join(thread5, NULL);
}
解决方案2 :
pthread_t thread_var[5];
for(i=0 ;i<5 ;i++) {
pthread_create(&thread_var[i],NULL,/** call through fun-ptr**/,(void*)args);
}
正如其他人所指出的那样由于您为5个线程只定义了一个处理程序func
,所有线程都在访问same thread handler(func)
,因为所有线程都尝试unexpected result
,所以它可能会在access/modify
中产生} func
内的相同变量。
无论如何没有循环pthread_create()5次,我仍然可以使用线程调用func()5次?
我认为意图可能是不要拨打func() from main thread
5次,而不是main thread only once
,而func()
你可以在不同的thread_handler
之间切换使用mutex
。
pthread_mutex_t m1,m2,m3;
void* fun1(void *p)
{
pthread_mutex_lock(&m1);
/** do ssome task here**/
sleep(1);
pthread_mutex_unlock(&m2);
}
void* fun2(void *p)
{
pthread_mutex_lock(&m2);
/** do some task here **/
sleep(1);
pthread_mutex_unlock(&m3);
}
void* fun3(void *p)
{
pthread_mutex_lock(&m3);
/*** do some task here **/
sleep(1);
pthread_mutex_unlock(&m1);
}