日期:2014-05-16  浏览次数:20780 次

求助C高手,线程和函数指针的问题。
C/C++ code


/*program 1*/

void thread1()
{
    int i;
    for(i=0;i<100;i++)
    {
              printf("%s",thread1);
              sleep(1);
          }
}

void thread2()
{
    int i;
    for(i=0;i<100;i++)
    {
              printf("%s",thread2);
              sleep(2);
          }
}

void main()
{
    int ret1,ret2;
    pthread_t id1,id2;
    int i;

    ret1 = pthread_create( &id1, NULL, (void *)thread1, NULL);
    ret1 = pthread_create( &id1, NULL, (void *)thread1, NULL);

    for(i=0;i<100;i++)
    {
              printf("%s",thread3);
              sleep(3);
          }
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_cancel(id1);
    pthread_cancel(id2);
}

/*program 2*/

void thread1(void (*thr)())
{
    int i;
    for(i=0;i<100;i++)
    {
              printf("%s",thread1);
              sleep(1);
          }
    thr();
}

void thread2()
{
    int i;
    for(i=0;i<100;i++)
    {
              printf("%s",thread2);
              sleep(2);
          }
}

void main()
{
    int ret1;
    pthread_t id1;
    int i;

    ret1 = pthread_create( &id1, NULL, (void *)thread1(thread2), NULL);

    for(i=0;i<100;i++)
    {
              printf("%s",thread3);
              sleep(3);
          }

    pthread_join(id1,NULL);
    pthread_cancel(id1);

}



项目中的问题!
源程序比较多,不方便贴出来。
类似上面两端代码,求助高手看看这个两段代码有什么区别。
程序结果不同,program1结果,thread1,thread2,thread3交替输出,program2结果,thread1和thread2输出后,thread3才输出。

我要以第二种方式实现,得到第一种的结果。

------解决方案--------------------
名称
pthread_create() - 创建新的执行线程。
概要
#include <pthread.h>
int pthread_create(
pthread_t *__restrict thread,
const pthread_attr_t *__restrict attr,
void *(*start_routine)(void *),
void *__restrict arg
);
参数
thread 指向要返回已创建线程的ID 的位置的指针。
attr 指向描述已创建线程的特性的线程属性对象的指针。如果该值为NULL ,则使用缺省的属
性。
start_routine
新建线程要执行的函数。
arg 要传递给已创建线程的start_routine 的参数
返回值
成功完成后, pthread_create() 将返回零。否则,将返回错误编号以指明错误(不设置errno 变量)。
------解决方案--------------------
LS正解,man pthread_create上有说,第四个参数是要线程函数的参数,第三个参数只能是线程函数的指针,不能带参(指针不能带参数的说,哈哈)


------解决方案--------------------
学东西
------解决方案--------------------
2楼把该说的都说了~
------解决方案--------------------
学习了。
------解决方案--------------------
你的程序写的太混乱的,
void thread2()
{
int i;
for(i=0;i<100;i++)

printf("%s",thread2);
sleep(2);
}
}

在printf中的thread2,你是想输出函数地址吗?
用%s,输出是错误的。
还有就是,按你program1,写的线程的结构,应该是按顺序输出的,而program2才是乱序的。