Linux多线程程序设计,(网络上流传的一道题)
来源:互联网 发布:淘宝订单贷款逾期 编辑:程序博客网 时间:2024/06/05 14:24
有四个线程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
...{
int loops; //表示要循环写入文件的次数
int fd;
int curData; //当前要写入文件的数字
pthread_mutex_t mutex;
}FILENODE,*LPFILENODE;
char *filenames[] = ...{"a.txt","b.txt","c.txt","d.txt"};
pthread_t pids[MY_THREAD_COUNT];
FILENODE filenodes[MY_THREAD_COUNT];
bool IsCompleted()
...{
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
if(filenodes[i].loops != MY_LOOP_COUNT)
return false;
}
return true;
}
void* ThreadFunc(void* para)
...{
int num = *(int*)para;
printf("Loop thread id: %d ",num);
char buf[50] = ...{""};
bool bExit = false;
while(!bExit)
...{
if(IsCompleted())
break;
printf("thread id : %d begin loops files ",num);
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
int rtn = pthread_mutex_trylock(&filenodes[i].mutex);
if(rtn == 0)
...{
if(filenodes[i].loops >= MY_LOOP_COUNT)
...{
pthread_mutex_unlock(&filenodes[i].mutex);
continue;
}
if(filenodes[i].curData == num)
...{
sprintf(buf,"%d:%d",num,filenodes[i].curData);
write(filenodes[i].fd,buf,strlen(buf));
filenodes[i].curData += 1;
}
if(filenodes[i].curData > 4)
...{
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()
...{
int i = 0;
for(i = 0;i<MY_THREAD_COUNT;i++)
...{
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++)
...{
pthread_join(pids[i],NULL);
}
for(int i = 0; i < MY_THREAD_COUNT;i++)
...{
if(!filenodes[i].fd)
...{
close(filenodes[i].fd);
}
}
return 0;
}
#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
...{
int loops; //表示要循环写入文件的次数
int fd;
int curData; //当前要写入文件的数字
pthread_mutex_t mutex;
}FILENODE,*LPFILENODE;
char *filenames[] = ...{"a.txt","b.txt","c.txt","d.txt"};
pthread_t pids[MY_THREAD_COUNT];
FILENODE filenodes[MY_THREAD_COUNT];
bool IsCompleted()
...{
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
if(filenodes[i].loops != MY_LOOP_COUNT)
return false;
}
return true;
}
void* ThreadFunc(void* para)
...{
int num = *(int*)para;
printf("Loop thread id: %d ",num);
char buf[50] = ...{""};
bool bExit = false;
while(!bExit)
...{
if(IsCompleted())
break;
printf("thread id : %d begin loops files ",num);
for(int i = 0; i < MY_THREAD_COUNT; i++)
...{
int rtn = pthread_mutex_trylock(&filenodes[i].mutex);
if(rtn == 0)
...{
if(filenodes[i].loops >= MY_LOOP_COUNT)
...{
pthread_mutex_unlock(&filenodes[i].mutex);
continue;
}
if(filenodes[i].curData == num)
...{
sprintf(buf,"%d:%d",num,filenodes[i].curData);
write(filenodes[i].fd,buf,strlen(buf));
filenodes[i].curData += 1;
}
if(filenodes[i].curData > 4)
...{
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()
...{
int i = 0;
for(i = 0;i<MY_THREAD_COUNT;i++)
...{
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++)
...{
pthread_join(pids[i],NULL);
}
for(int i = 0; i < MY_THREAD_COUNT;i++)
...{
if(!filenodes[i].fd)
...{
close(filenodes[i].fd);
}
}
return 0;
}
通过Shell>: g++ -g -o Threads main.C -lpthread
生成可执行文件Threads,执行可执行文件后就可以查看结果。对于上面的题目,我做了一个扩冲,就是设定了循环的次数。
- Linux多线程程序设计,(网络上流传的一道题)
- 网络上流传的“熊猫烧香”病毒代码
- 网络上的一道题目(1)
- 大陆申请GooglePlay账号的方法(目前网络上流传的方法是不正确的)
- 点评网络上流传的提高性能的Java编码方式
- 点评网络上流传的提高性能的Java编码方式
- 一道简单的多线程题
- 一道多线程的笔试题
- Linux上的网络聊天程序--多线程的服务器程序
- 海盗瓜分金币--一道网上流传的微软面试题
- 网络流传的新股民之歌
- 一道算24点的程序设计题!!
- 网络的一道开放题
- 一道网络题的看法
- codility上的一道题
- poj上的一道题
- 一道笔试程序设计题
- 一道经典的Java多线程编程题
- 那位起名高手给我家的小宝宝起个名字啊
- Java工具集介绍10_24
- onblur在html中的意思是:控件在失去焦点的时候触发的事件
- Java工具集介绍11_04
- 盛云网络-IP地址转城市数据库
- Linux多线程程序设计,(网络上流传的一道题)
- 字符转换时出现的诡异问题
- [Fedora core 7.0]使用CDlinux制作usb os
- ubuntu,新的开始,纪念帖
- 确定字符编码是否为UTF-8格式 函数 (1)
- 【Fedora core 7.0】增加Neoshine Linux 3.0软件
- 技术文章,链接收藏.
- 不能使用 mb_strlen 函数的问题
- VS 2005 快捷键