Tag: pthreads

使用条件变量和互斥量来同步C中的线程

根据评论者的要求编辑。 该程序创建两个线程。 每个线程从两个特定输入文件中的一个读取,每个输入文件包含一行字母或每行代码一个’0’。 线程应该将字母读入全局字符数组,然后打印出来。 问题是,在达到’0’时,活动线程必须将控制转移到另一个线程,该线程在该线路上不应该为’0’。 (我们确信,如果文件1在一行上有一个’0’,那么相应行上的文件2就有一个字母。多个零可以互相跟随,多个字母也可以。) 文件一 h 0 h 0 h 0 h 0 h 0 文件二 0 i 0 i 0 i 0 i 0 i 我正在尝试使用pthread互斥锁定/解锁以及信号并等待使其工作。 但是,我一直处于僵局状态。 有两个线程。 目前,它们彼此镜像意味着它们执行相同的操作,只是使用不同的文件和相反的条件。 线程示例: char final[1001]; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condition1 = PTHREAD_COND_INITIALIZER; pthread_cond_t condition2 = PTHREAD_COND_INITIALIZER; int w = 1; void *get() { //start […]

什么时候pthread_attr_t不是NULL?

除了pthread_attr_t之外,来自POSIX线程的pthread_create的所有参数都非常简单易懂。 pthread_attr_t是什么,如何以及何时不应该被NULL初始化? 我浏览了Linux 手册页 。 我发现有关pthread_attr_t的描述是: 句法: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void*),void *arg); 说明: The attr argument points to a pthread_attr_t structure whose contents are used at thread creation time to determine attributes for the new thread; this structure is initialized using pthread_attr_init(3) and related functions. If attr is NULL, then […]

从新线程C调用方法

我正在研究一个项目(不是家庭作业),在C中构建一个multithreading的数独解决方案validation器。我是C的新手,所以请原谅我的代码质量不好,因为我还在改进。 我想从9个单独的线程中调用方法row_check 9次。 对于作为参数的方法,我传递行号( arg )和数组名称( arr )。 我创建了线程,但我不确定如何将参数正确传递给方法。 谁能帮我这个? #include #include #include #include void* row_check(void* arg, int *arr) { int i = *((int *)arg); //trying to convert row number to int int j, flag; while(i < 9) { flag=0x0000; for(j = 0; j < 9; j++) flag |= 1 << (arr[i][j]-1); if (flag != […]

scanf()调用之后的指令被调用两次

以下程序: #include #include char input; void * dpy(void *args) { printf(“\n[input] = %c\n”, input); } void * read(void *args) { pthread_t child; printf(“Write whatever – press ‘F’ to end\n”); do { scanf(“%c”, &input); printf(“begin\n”); pthread_create(&child, NULL, dpy, NULL); pthread_join(child, NULL); printf(“end\n”); } while (input!=’F’); printf(“done\n”); } void main () { pthread_t parent; pthread_create(&parent, NULL, read, […]

C / unix套接字:由于char指针(?)导致的分段错误(核心dumbed)

(也许是这个问题的重复,但我发现很难自己查明我的问题,所以如果这里的答案与其他问题几乎相同,我会尝试删除这个问题) 我想创建一个客户端和一个服务器程序(使用pthreads的多个客户端),其中每个客户端发送N个号码(由用户输入)到服务器,服务器返回这些号码的平均值,如果是“确定消息”,如果平均值> 10,否则服务器返回“不正常消息”。 在客户端打印服务器的结果之后,询问用户是否要为其平均值输入新的数字序列。 这是我到目前为止的地方: 客户: #include #include #include #include #include #include #include #define SOCK_PATH “avg_socket” int main(void) { int i, s, t, len, done; int numofintegers; int yesorno; int average, avg; char *sequencecheck; struct sockaddr_un remote; char str[100]; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror(“socket”); exit(1); } printf(“Trying to connect…\n”); remote.sun_family […]

Pthread同步:两个文本文件的返回和读取

我正在编写一个创建两个线程的程序。 每个线程负责读取一个文本文件,每行有一个字符。 第一种格式如下: h 0 h 0 … 第二个格式如下: 0 i 0 i 0 i 有时可能会有多个字母在彼此之后,或者在彼此之后有多个零。 但是,可以肯定的是,如果一个文件的一行上有一个字母,则第二个文件的相应行将为0,反之亦然。 线程应该继续将文件输入读入全局char数组,直到它们达到零。 此时,他们允许其他线程接管。 他们一直来回走,直到两个文件完全被读取。 在这一点上,当我跑步的时候,我得到的变化是:(1)很多h后跟很多我或(2)( 正确答案 )连续的hihihi流,或者(3)有时很多我跟着很多h。 所以,我知道我的同步方法已关闭。 这是我的一个线程的示例:(注意两个线程完全相同,除了正在打开的文件。) void *getMessage1() { FILE *studentOne = fopen(“Student1”, “r”); size_t howManyChars; char *placeHolderChars; int count = 1; while (count 0) { placeHolderChars[1] = ‘\0’; } strcat(message,placeHolderChars); } free(placeHolderChars); if(feof(studentOne)) { pthread_mutex_unlock(&lock); […]

裸机环境下的stdlib式库? (内存管理和希望pthread支持)

是否存在用于裸机编程的类似stdlib的库? 我正在尝试为裸机环境构建一个程序(应该是在linux上构建)。 该程序依赖于stdlib和posix lib(malloc,calloc,realloc,free和pthread用法)。 无论如何我会修改单线程。 我正在阅读https://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/ ,也许我将实现自己的内存管理。 但在我的情况下,该程序具有各种大小的malloc / realloc / free。 如果有任何程序(开源)支持内存管理(并希望也是pthread)。请给我一个建议。 语言是C.

Pthreads矩阵乘法误差

我想在现有的串行矩阵乘法代码上使用pthreads。 我的目标是使用pthreads实现更好的执行时间,只是为了实现加速。 但那时我被困住了。 我的原始序列号,工作正常,我在大约15秒内完成1000×1000方阵乘法。 但是当我执行当前的pthreads程序时,我遇到了分段错误。 这是我的代码: #include #include #include #include int SIZE, NTHREADS; int **A, **B, **C; void init() { int i, j; A = (int**)malloc(SIZE * sizeof(int *)); for(i = 0; i < SIZE; i++) A[i] = malloc(SIZE * sizeof(int)); B = (int**)malloc(SIZE * sizeof(int *)); for(i = 0; i < SIZE; i++) B[i] […]

如何测量C中每个线程的时间?

我正在研究具有多个线程的代码,我想打印完成任务所花费的时间,我分配了第i个线程。 含义我想打印每个线程使用doSomeThing函数完成的时间 int main(int argc, char *argv[]){ // … i=0; while (i < NumberOfThreads){ check = pthread_create(&(id_arr[i]), NULL, &doSomeThing, &data); i++; } // … } void* doSomeThing(void *arg){ // … } 如果我在pthread_create之前添加gettimeofday(&thread_start, NULL)然后在pthread_create之后添加gettimeofday(&thread_end, NULL) ,我实际上会测量每个线程花费的时间还是主要花费的时间? 如果我把gettimeofday放在doSomething函数中,它们不会创建竞争条件吗? 如果您对如何测量每个线程的时间有任何想法,请告诉我,谢谢。

创建(分离)的线程从未执行过

我写了这段代码: void* th (void* arg) { sleep(1); for(int i=0; i<1000;i++) { fprintf(stderr,"%d\t",i); } pthread_exit(NULL); } int main(int argc, char** argv) { pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&thread,&attr,th,NULL); pthread_attr_destroy(&attr); return 0; } 分离状态应该使线程不可连接,所以它应该在主进程终止后运行。但是它不打印数字,我看到的是线程终止而没有向stderr打印任何内容。 为什么不执行分离的线程?