有四个线程1,2,3,4,线程1的功能就是输出1,线程2的功能就是输出2,以此类推.....
现在有四个文件.ABCD.初始都为空.
现要让四个文件呈如下格式:
A: 1 2 3 4 1 2....
B: 2 3 4 1 2 3....
C: 3 4 1 2 3 4....
D: 4 1 2 3 4 1....
设计程序.
#include
<
sys
/
types.h
>
#include
<
sys
/
stat.h
>
#include
<
fcntl.h
>
#include
<
pthread.h
>
#include
<
stdio.h
>
#include
<
errno.h
>
#include
<
string
.h
>
#include
<
malloc.h
>
#include
<
stdlib.h
>
#include
<
unistd.h
>
//
usleep ,sleep
#define
MY_THREAD_COUNT 4
#define
MY_LOOP_COUNT 3
typedef
struct
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int loops; //表示要循环写入文件的次数
int fd;
int curData; //当前要写入文件的数字
pthread_mutex_t mutex;
}
FILENODE,
*
LPFILENODE;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
char
*
filenames[]
=
...
{"a.txt","b.txt","c.txt","d.txt"}
;
pthread_t pids[MY_THREAD_COUNT];
FILENODE filenodes[MY_THREAD_COUNT];
bool
IsCompleted()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
for(int i = 0; i < MY_THREAD_COUNT; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(filenodes[i].loops != MY_LOOP_COUNT)
return false;
}
return true;
}
void
*
ThreadFunc(
void
*
para)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int num = *(int*)para;
printf("Loop thread id: %d ",num);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
char buf[50] = ...{""};
bool bExit = false;
while(!bExit)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(IsCompleted())
break;
printf("thread id : %d begin loops files ",num);
for(int i = 0; i < MY_THREAD_COUNT; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
int rtn = pthread_mutex_trylock(&filenodes[i].mutex);
if(rtn == 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(filenodes[i].loops >= MY_LOOP_COUNT)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
pthread_mutex_unlock(&filenodes[i].mutex);
continue;
}
if(filenodes[i].curData == num)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sprintf(buf,"%d:%d",num,filenodes[i].curData);
write(filenodes[i].fd,buf,strlen(buf));
filenodes[i].curData += 1;
}
if(filenodes[i].curData > 4)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
filenodes[i].curData = 1;
filenodes[i].loops++;
}
pthread_mutex_unlock(&filenodes[i].mutex);
}
}
usleep(500000);
}
printf("thread id : %d, succeed exit! ",num);
free(para);
}
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i = 0;
for(i = 0;i<MY_THREAD_COUNT;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
filenodes[i].fd = open(filenames[i],O_CREAT|O_WRONLY,S_IRUSR|S_IWUSR);
filenodes[i].loops = 0;
filenodes[i].curData = i+1;
int rtn = pthread_mutex_init(&filenodes[i].mutex,NULL);
int* para = (int*)malloc(sizeof(int));
*para = i+1;
rtn = pthread_create(&pids[i],NULL,ThreadFunc,para);
}
for(i = 0;i<MY_THREAD_COUNT;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
pthread_join(pids[i],NULL);
}
for(int i = 0; i < MY_THREAD_COUNT;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(!filenodes[i].fd)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
close(filenodes[i].fd);
}
}
return 0;
}
通过Shell>: g++ -g -o Threads main.C -lpthread
生成可执行文件Threads,执行可执行文件后就可以查看结果。对于上面的题目,我做了一个扩冲,就是设定了循环的次数。