- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为类(class)开发一个多线程字数统计程序,我已经完成了大部分工作,但是,尽管使用警告标签成功编译了,但我的程序立即崩溃了。因此,基本上该程序应该获取给定的 txt 文档(这只是书中的文本)并将其分成 16 个线程,这些线程分别对单词进行计数,并将总数在 main 中求和。这是我的代码:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
pthread_mutex_t mutex;
//pthread_cond_t cond;
typedef struct thread_data
{
int input;
int offset;
int size;
int wordCount;
} thread_data;
void *counter(void *arg)
{
thread_data *data = (thread_data *)arg;
char *buffer = malloc(data->size);
int i;
int count = 0;
int isChar = 0;
pthread_mutex_lock(&mutex);
lseek(data->input, data->offset, SEEK_SET);
read(data->input, buffer, data->size);
for (i = 0; i < data->size; i++)
{
if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] =='\n')
{
isChar = 0;
}
else
{
if (isChar == 0)
{
count++;
}
isChar = 1;
}
}
data->wordCount = count;
free(buffer);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
return NULL;
}
int main()
{
int id;
int segSize;
int total;
//int fileSize;
pthread_t *threads;
int input;
input = open("Assign3.txt", O_RDONLY); //open file
segSize = lseek(input,0,SEEK_SET)/16; //Getting segment size for partition
struct thread_data data[16];
threads = malloc(16*sizeof(pthread_t));
for(id =0; id < 16; id++) //Partitioning of file to threads
{
data[id].input = input;
data[id].offset = id*segSize;
}
pthread_mutex_init(&mutex, 0);
for(id = 0; id < 16; id++) //create threads
{
pthread_create(&threads[id], NULL, &counter, &data[id]);
}
for(id = 0; id < 16; id++)
{
pthread_join(threads[id], NULL);
}
for(id = 0; id < 16; id++) //compute total from threads
{
total += data[id].wordCount;
}
printf("There are %i words in this document.\n", total);
//cleanup
pthread_mutex_destroy(&mutex);
close(input);
return 0;
}
以前,这会编译并且在运行时会崩溃。我不认为我改变了任何东西,但是现在当我使用 MinGW 和命令编译它时(第一个正是我的教授将如何编译代码)
gcc -Wall -Werror -lpthread Assign3_MichaelMorro.c
//or
gcc -Wall -Werror Assign3_MichaelMorro.c
我收到以下错误:
In file included from Assign3_MichaelMorro.c:3:0:
c:\mingw\include\pthread.h:320:8: error: redefinition of 'struct timespec'
struct timespec {
^
In file included from c:\mingw\include\time.h:53:0,
from c:\mingw\include\pthread.h:219,
from Assign3_MichaelMorro.c:3:
c:\mingw\include\parts\time.h:105:8: note: originally defined here
struct timespec
^
我该如何处理这个问题?在带有 native gcc 的 Linux 计算机上执行此操作是否可能有效?如果有人使用 Linux 并且可以尝试为我编译这个,我将不胜感激。
最佳答案
当我编译你的代码时,我收到警告。对我来说,这些警告似乎相当严重。
$ gcc -Wall a.c -o a -lpthread
a.c: In function 'counter':
a.c:28: warning: cast from pointer to integer of different size
a.c:29: warning: cast from pointer to integer of different size
a.c: In function 'main':
a.c:65: warning: cast from pointer to integer of different size
当我查看这些行时,我发现您正在将 FILE*
转换为 int
。
这完全是错误的。
您应该将 lseek
函数调用替换为适用于 FILE*
的函数调用,例如 fseek
。
或者,如果您更喜欢使用 lseek
/read
等,您应该使用 open
打开文件,它返回一个文件描述符(类型 int
)。
如果由于某种原因,您不想切换到 open()
,您可以从 FILE* fp
获取文件描述符,如下所示:
int file = fileno(fp);
关于C - 多线程 WordCount 运行时崩溃 - 现在编译失败 : redefinition of struct timespec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35936924/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!