为什么每次运行后显示的结果都不一样呢?
这个原因应该是在哪个地方呢?
希望你一针见血。谢谢了。
#include<stdio.h>
#include<pthread.h>
#include<sys/time.h>
#include<string.h>
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0,i;
void thread1()
{
printf("thread1:I'm thread 1\n");
for(i=0;i<MAX;i++)
{
printf("thread1:number=%d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(2);
}
printf("thread1:主函数在等我完成任务吗?\n");
pthread_exit(NULL);
}
void *thread2()
{
printf("thread2:I'm thread2\n");
for(i=0;i<MAX;i++)
{
printf("thread2:number=%d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(3);
}
printf("thread2:主函数在等我完成任务吗?\n");
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread,0,sizeof(thread)); //comment1
/*创建线程*/
if((temp=pthread_create(&thread[0],NULL,thread1,NULL))!=0) //comment2
printf("线程1创建失败!\n");
else
printf("线程1被创建!\n");
if((temp=pthread_create(&thread[1],NULL,thread2,NULL))!=0) //comment3
printf("线程2创建失败!\n");
else
printf("线程2被创建!\n");
}
void thread_wait(void)
{
/*等待线程结束*/
if(thread[0]!=0)
{ //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束!\n");
}
if(thread[1]!=0)
{ //comment5
pthread_join(thread[1],NULL);
printf("线程2已经结束!\n");
}
}
int main()
{
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
printf("我是主函数哦,我正在创建线程\n");
thread_create();
printf("我是主函数哦,我正在等待线程完成任务!\n");
thread_wait();
return 0;
}
在线等。
15 个解决方案
#1
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第一次结果
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第一次结果
#2
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!
第2个结果
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!
第2个结果
#3
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第3次结果。
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第3次结果。
#4
线程的执行是独立的
#5
.学知网是个有5000G学习资料的下载网站,注册后可免费下载以下资料:
.[路径]电脑网络-计算机源码-VC源代码-vc-EasyFTP-RES
.[地址]http://www.stuknow.com/dirlist/10002/cb4a155be4c47617654a9183d5c6a013.htm?popid=chenhj_wo
#6
printf("thread2:number=%d\n",number);
放到互斥锁里面
放到互斥锁里面
#7
另外你看的什么书呀?
#8
要是我要让它们同步的话
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。
#9
看得一本很老的,02年的那个LINUX应用开发基础,上面用的初始化互斥锁是
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0)
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0)
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。
#10
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
pthread_mutex_destroy(&attr);
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
pthread_mutex_destroy(&attr);
#11
多线程的程序,在执行的过程要做线程切换,所以执行每次执行的结果是不一样的;
只要保证需要的数据正确就可以
只要保证需要的数据正确就可以
#12
直接man下,有不同系统下,头文件和函数都不太相同的。
但是pthread_mutex_init是posix,应该Unix和linux都会支持的。
这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。
但是pthread_mutex_init是posix,应该Unix和linux都会支持的。
这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。
#13
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
这样设置属性以后都不是同步的吗?
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
这样设置属性以后都不是同步的吗?
#14
顺便问下,2个线程,线程1不停的读取文件,线程2每过100毫秒输出一个当时线程1读取的字符,这个怎么实现呢? 2个线程如何联系起来?
#15
这个一般弄成个队列,就跟生产者和消费者一样。
#1
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第一次结果
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第一次结果
#2
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!
第2个结果
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!
第2个结果
#3
我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第3次结果。
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!
第3次结果。
#4
线程的执行是独立的
#5
.学知网是个有5000G学习资料的下载网站,注册后可免费下载以下资料:
.[路径]电脑网络-计算机源码-VC源代码-vc-EasyFTP-RES
.[地址]http://www.stuknow.com/dirlist/10002/cb4a155be4c47617654a9183d5c6a013.htm?popid=chenhj_wo
#6
printf("thread2:number=%d\n",number);
放到互斥锁里面
放到互斥锁里面
#7
另外你看的什么书呀?
#8
要是我要让它们同步的话
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。
#9
看得一本很老的,02年的那个LINUX应用开发基础,上面用的初始化互斥锁是
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0)
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0)
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。
#10
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
pthread_mutex_destroy(&attr);
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
pthread_mutex_destroy(&attr);
#11
多线程的程序,在执行的过程要做线程切换,所以执行每次执行的结果是不一样的;
只要保证需要的数据正确就可以
只要保证需要的数据正确就可以
#12
直接man下,有不同系统下,头文件和函数都不太相同的。
但是pthread_mutex_init是posix,应该Unix和linux都会支持的。
这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。
但是pthread_mutex_init是posix,应该Unix和linux都会支持的。
这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。
#13
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
这样设置属性以后都不是同步的吗?
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr);
这样设置属性以后都不是同步的吗?
#14
顺便问下,2个线程,线程1不停的读取文件,线程2每过100毫秒输出一个当时线程1读取的字符,这个怎么实现呢? 2个线程如何联系起来?
#15
这个一般弄成个队列,就跟生产者和消费者一样。