Tag: multithreading

Semaphore与multithreading中的条件变量?

问题 :我必须增加x1和x2变量,这应该由不同的线程完成,并且在两个变量的上一个增量都没有完成之前,不应该调用两个变量的下一个增量。 问题: x1 = 0; x2 = 0; x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 1 and x2 = 1 x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 2 and x2 = 2 x1++; and […]

对pthread_create()中的参数感到困惑

我的问题:为什么不直接传递&i作为pthread_create()的最后一个参数? 相反,他创建一个数组来保持相同的东西…. #define THREAD_CT 2 /* bump this up a few numbers if you like */ void *print_stuff(void *ptr) { int i, id= * (int *) ptr; for (i= 0; i < 5; i++) { printf("Thread %d, loop %d.\n", id, i); sleep(rand() % 2); /* sleep 0 or 1 seconds */ } printf("Thread %d exiting.\n", […]

带线程的C / C ++数组 – 我需要使用互斥锁还是锁?

我是使用线程的新手,并且已经阅读了很多关于如何共享数据和保护数据的信息。 但是我还没有真正掌握何时需要使用互斥锁和锁来保护数据。 以下是我将要解决的问题的描述。 需要注意的重要一点是它对时间至关重要,因此我需要尽可能减少开销。 我有两个固定大小的双arrays。 第一个数组将为后续计算提供数据。 线程将从中读取值,但永远不会被修改。 任何线程都可以在某个时间读取元素。 第二个数组将用于存储计算结果 由线程执行。 此数组的元素只能由一个线程更新,并且可能只在结果值时更新一次 是写的。 我的问题呢? 每次从只读数组访问数据时,是否真的需要在线程中使用互斥锁? 如果是这样你能解释原因吗? 在写入结果数组时,是否需要在线程中使用互斥锁,即使这将是唯一写入此元素的线程? 我应该使用primefaces数据类型吗?如果我这样做会有任何重要的时间吗? 这类问题的答案似乎很多 – 不,如果您的变量是对齐的,则不需要互斥锁。 我的数组元素在这个示例中是否会对齐,或者是否有某种方法可以确保它们是? 代码将在64位linux上实现。 我打算使用Boost库进行multithreading处理。 感谢所有的回复和评论,我一直在仔细研究这个问题并在网上看了好几天,并且一旦发布了答案,并且在几秒钟之内就会有明确的解释。 有一个“已接受的答案”,但所有答案和评论都同样有用。 再次感谢

在不使用其他function的情况下在C扩展中释放全局VM锁定

我不明白为什么在Ruby C API中发布或获取GVL时需要另一级间接。 rb_thread_call_without_gvl()和rb_thread_call_with_gvl()都需要一个只接受一个参数的函数,但并非总是如此。 我不想仅仅为了释放GVL而将我的参数包装在结构中。 它使代码的可读性变得复杂,并且需要从void指针进行转换。 在查看Ruby的线程代码后,我发现了与Python的Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS匹配的GVL_UNLOCK_BEGIN / GVL_UNLOCK_END宏,但我找不到有关它们的文档以及它们何时可以安全使用。 在rb_thread_call_without_gvl()也使用了BLOCKING_REGION宏,但是我不确定在不调用rb_thread_call_without_gvl()本身的情况下将它作为独立使用是否安全。 在不必调用其他函数的情况下,在执行流程中安全释放GVL的正确方法是什么?

GST_DEBUG:如何将日志保存在应用程序内部线程的单独文件中

我正在运行gstreamer的示例程序,它是从C ++应用程序作为线程调用的。 已设置GST_DEBUG=*:5级别以捕获所有可能的方案。 该应用程序还在stdout上打印了大量的日志,而gstreamer线程也是如此(级别5增加了痛苦)。 问题 – 有没有办法在给定调试级别的文件中分离出gstreamer线程的日志打印? 补充问题 – 根据答案下面的答案设置GST_DEBUG_FILE,但文件从某些字符开始而不是从GST_DEBUG开始 0:00:00.000036045 ^[[335m21088^[[00m 0x8405800 ^[[37mLOG ^[[00m ^[[00;01;33m GST_DEBUG gstinfo.c:1329:for_each_threshold_by_entry:^[[00m category default matches pattern 0x8405570 – gets set to level 5 0:00:00.000109741 ^[[335m21088^[[00m 0x8405800 ^[[32;01mINFO ^[[00m ^[[00;01;31m GST_INIT gst.c:613:init_pre:^[[00m Initializing GStreamer Core Library version 0.10.36 0:00:00.000123496 ^[[335m21088^[[00m 0x8405800 ^[[32;01mINFO ^[[00m ^[[00;01;31m GST_INIT gst.c:614:init_pre:^[[00m Using library installed in […]

在这种情况下我真的需要互斥锁吗?

考虑我们有三个线程, bool status_flag[500]数组,以及如下工作情况: 两个线程只在不同索引处写入status_flag数组。 而第三个线程只读取任何索引。 所有三个线程写在不同的索引。 虽然所有三个线程都在读取任何索引。 在写入操作中,我们只是设置标志永远不会重置它。 status_flag [i] = true; 在阅读操作中,我们正在做类似的事情: for(;;){ //spinning to get flag true if(status_flag [i] == true){ //do_something ; break; } } 如果编译器优化(分支预测)代码会发生什么? 我已经阅读了很多关于锁的内容,但仍然对结论结果感到困惑。 请帮我总结一下。

pthread_kill没有杀死线程C linux

我正在制作一个小项目,将其纳入更大的项目。 它的作用基本上是跟踪通过将它们添加到主结构而创建的线程,主结构跟踪线程的作用(主要function)和pthread_t id。 另一个struct跟踪要传递给函数的数据以及pthread_t id存储在threads []中的元素号。 它有点micky鼠标,它跳了一下但是除了什么时候杀死线程它都有效。 我得到没有段错误和没有错误,程序完成得很好,但是当调用pthread_kill()时,线程不会被杀死(函数返回0表示没有错误并且它有效)尽管线程继续运行直到主应用程序返回。

是在线程安全的不同字节范围读取和写入同一文件?

我有一个名为“data.txt”的文件,总是有50个字节的数据。 我有两个主题。 第一个线程,从字节0到字节50读取内容: while(1){ char buf[50]; FILE* fp = fopen(“data.txt”,”r”); fread(buf,1,50,fp); /* process data */ fclose(fp); } 第二个线程,将数据附加到文件(=始终在前50个字节之后): while(1){ FILE* fp = fopen(“data.txt”,”a”); fwrite(“hello\n”,1,6,fp); fclose(fp); } 这个解决方案是线程安全且可移植的吗? (没有分段错误,没有数据不一致,……)

一次读取多行文件的有效方法?

我现在正在尝试处理一个大文件(几GB),所以我想使用multithreading。 该文件是多行数据,如: data1 attr1.1 attr1.2 attr1.3 data2 attr2.1 attr2.2 attr2.3 data3 attr3.1 attr3.2 attr3.3 我想用一个线程首先读取多行到buffer1,然后另一个线程逐行处理buffer1中的数据,而读取线程开始读取文件到buffer2。 然后,当buffer2准备好时,处理线程继续,并且读取线程再次读取到buffer1。 现在我通过使用freads为小文件(几KB)完成了处理程序部分,但我不知道如何使缓冲区包含完整的行而不是在缓冲区的末尾分割行的一部分,这是这样的: data1 attr1.1 attr1.2 attr1.3 data2 attr2.1 att 另外,我发现fgets或ifstream getline可以逐行读取文件,但由于它有很多IO,它会非常昂贵吗? 现在我正在努力弄清楚这是最好的方法吗? 有没有一种有效的方法一次读取多行? 任何建议表示赞赏。

取消或杀死pthread

gcc (GCC) 4.6.3 valgrind-3.6.1 我创建了一个应用程序,在2个不同的线程中发送和接收一些消息,用于发送和接收。 使用pthreads,条件可变和锁定互斥锁。 但是,发送方将发送消息,然后通知接收方接收消息并进行处理。 它在while循环中执行此操作。 但是,如果我想通过使用ctrl-c并处理中断来退出应用程序,则会出现问题。 如果没有发送消息,则接收器卡在等待接收的while循环中。 主线程将调用join和block等待接收器完成。 但它没有等待pthread_cond_wait 。 我在考虑使用pthread_cancel或pthread_kill 。 但我不喜欢这样做,因为它不允许线程正常退出。 非常感谢任何建议。 主function void main(void) { /* Do some stuff here */ /* Start thread that will send a message */ if(pthread_create(&thread_recv_id, &thread_attr, thread_recv_fd, NULL) == -1) { fprintf(stderr, “Failed to create thread, reason [ %s ]”, strerror(errno)); break; } […]