- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序由许多将数据写入缓冲区的写入线程和一个从该共享缓冲区读取数据并将其输出的读取线程组成。我需要确保所有写入线程都已将其数据写入缓冲区,然后读取线程尝试从中读取数据。我的直觉告诉我我会使用信号量来实现这一点,但它们对我来说确实没有多大意义。这是我的两个功能:
void *search_thread_func(void *threadArgs)
{
printf("\n");
//pthread_mutex_lock(&mutex);
int count = 0;
int matches = 0;
int matches_this_line = 0;
int lines = 0;
int inputLines = 0;
int tid;
int *wbPtr;
//char *buffer;
char *sharedBuffer;
char *writeBuffer;
char* string;
string = ((struct st_args*)threadArgs)->string;
tid = ((struct st_args*)threadArgs)->threadId;
wbPtr = ((struct st_args*)threadArgs)->wBufPtr;
//buffer = ((struct st_args*)threadArgs)->threadBuffer;
sharedBuffer = ((struct st_args*)threadArgs)->sharedBuffer;
writeBuffer = ((struct st_args*)threadArgs)->writeBuffer;
//printf("Thread %d\n",(int)tid);
printf("Searching for %s\n", string);
//printf("%d\n", (int)sharedBuffer);
while(sharedBuffer[count] != NULL)
{
//printf("%c", sharedBuffer[count]);
count++;
if(sharedBuffer[count] == '\n')
{
inputLines++;
}
}
printf("\n");
//pthread_mutex_unlock(&mutex);
char *token;
char *temp = malloc(count*sizeof(char));
memcpy(temp, sharedBuffer, count);
token = strtok(temp, "\n");
while(token != NULL)
{
printf("%s\n", token);
char *q = strstr(token, string);
if(q != NULL)
{
matches_this_line++;
lines++;
for(char *r = q; r != NULL; r= strstr(r+strlen(string), string))
{
matches++;
}
pthread_mutex_lock(&mutex);
for(int j = 0; j < strlen(token); j++)
{
writeBuffer[*wbPtr] = token[j];
*wbPtr = *wbPtr + 1;
}
writeBuffer[*wbPtr] = '\n';
*wbPtr = *wbPtr + 1;
pthread_mutex_unlock(&mutex);
}
token = strtok(NULL, "\n");
}
printf("lines %d, matches %d\n", lines, matches);
printBuffer(writeBuffer, *wbPtr);
free(temp);
printf("\n");
}
void *write_thread_func(void *threadArgs)
{
printf("write func\n");
char *writeBuffer;
int * wbPtr;
FILE* wFP;
writeBuffer = ((struct wt_args*)threadArgs)->writeBuffer;
wFP = ((struct wt_args*)threadArgs)->wFP;
wbPtr = ((struct st_args*)threadArgs)->wBufPtr;
printf("wbPtr = %d\n", wbPtr);
printf("*wbPtr = %d\n", *wbPtr);
//printf("wb loc = %d\n", writeBuffer);
}
基本上,搜索线程搜索一些数据并将其他数据写入缓冲区。我还没有实现 write_thread_func 从缓冲区读取,但这非常简单。我了解互斥锁的工作原理,但我认为这在这里不起作用,因为我需要确保 write_thread_func 最后执行,或者等到 search_thread_funcs 完成写入缓冲区。
最佳答案
如果数据的使用者也是处理数据的线程的创建者,它可以简单地 pthread_join
它们全部并确保它们完成。否则,执行此操作的规范方法是在数据结构中使用互斥体和条件变量,以及基于数据结构内容的“数据已完成”谓词。使用者将等待条件变量,并且在更新谓词所依赖的数据并同时持有互斥体后,生成数据的线程将发出信号。
有多种方法可以使用信号量实现相同的目的(例如,让每个生产者发布信号量一次,而消费者等待 N
次,其中 N
是信号量的数量生产者),但这种类型的设计要求您的消费者了解更多细节(例如有多少生产者),而这些细节可能不是其需要了解的。
关于c - 如何在执行某些操作之前确保其他线程已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238390/
这是我的 Androidmanifest.xml
我正在开始使用 redux-toolkit,在阅读文档并实现一些代码后,有些东西我不太明白,或者可能我的方法是错误的,这就是我在这里问的原因。无论如何,我有一些带有 asyncThunk 的切片,它调
My scenario 我使用 Coroutines 和 Room 来保存我的应用程序的用户配置文件数据。我有 CompleteProfileActivity :在那个用户填写他们的信息并确认它(确认
//更新:提供的答案有效,但我遇到了另一种情况。如果学生转到另一个职位,当有重叠时,他们需要保留完成前一个职位的学分。情况见下: 我有 2 门类(class),类(class) A 和类(class)
我想创建一个界面设计略有不同的简单计算器应用程序。如下图所示,我有来自用户的三个输入:第一个数字、运算符和第二个数字。我的问题是,一旦用户填写了这三个文本字段,等号 (resultBtn) 就会改变颜
我有一个 TransformManyBlock 可以创建许多“ Actor ”。它们流经多个 TransformBlocks 处理。一旦所有 Actor 都完成了所有步骤,我需要再次将所有内容作为一个
我正在尝试子类化 NSOperation,并从中读取一些样本,他们说:任务完成后,使用 NSOperation 的 KVO 来完成操作,代码在这里: [self willChangeValueForK
我有一个重新加载数据的应用程序(通过运行两个查询,将查询的信息附加到数组,然后重新加载 tableview 数据)。这两个查询都设置为在 viewDidLoad() 上运行的函数,但也链接到刷新函数(
我有个小问题。我们的一位客户自己开了一家 WooCommerce 商店,却忘记了加税。由于他不知所措,他决定寻求帮助来设置这一切。 不幸的是,现在这家商店已经上线,并且有大约 50 个已完成的订单。我
这个问题可能听起来像重复,但我已经尝试了有关 stackoverflow 的其他类似问题中的所有步骤,但都没有奏效。我正在尝试使用 ionic 连接到 Rails API。 我的设置是 Rails 4
调用ActionResult后如何打印结果? 例如,这是我从 View 中进行的调用: 这是我的 ReadLaterController 方法: public ActionRes
我们 3 年前为 Android 构建了一个应用程序。我们需要提交对应用程序的更新,但我们没有原始应用程序(我们正在更新的应用程序。我们的原始开发人员无处可寻)中使用的私钥。 我们如何解决这个问题?!
我正在将 google 的 reCaptcha 添加到我的表单中。问题是即使我已经按照谷歌的说明进行操作。我仍然可以在不重新验证的情况下按提交按钮。任何想法请继承相关的代码片段。 webpage
我的QThread run 方法正在结束,但我无法获得信号。 完整代码如下: 我的线程标题: #ifndef MYTHREAD_H #define MYTHREAD_H #include #incl
我有一个操作列表和一个按钮。 当用户点击按钮时,操作按顺序执行。 每次操作完成时,它都会设置一个标志(更新 UI),并继续执行下一个操作。 如果一个 Action 失败,所有剩余的 Action 将停
我正在寻找类似于 Firebase 的东西 completion block确认我在切换到下一个 ViewController 之前删除了所有 Firebase 回调 ref.removeAllObs
我正在将 ios 应用程序与 rails 服务器集成。在这里,我实现了设计身份验证。当新人从我的应用程序注册时,我在日志中收到以下错误 Processing by Devise::Registrati
我有这种情况: 我得到了用户在启动应用程序时将打开的主要 Activity ,该 Activity 内部是顶部栏中选项卡旁边的 Viewpager,因此用户可以在 4 个 fragment 之间导航。
我有一个应该在后台运行的服务。它在我的应用程序打开时开始,并在我的应用程序被用户关闭时结束。 每当我的应用在后台或屏幕关闭时,我仍然需要运行该服务。 我通过 WakeLock 实现了这一点,但由于某种
在 Firebase 控制台中,函数/日志部分中的最后一条事件消息是“函数执行耗时 60006 毫秒,完成状态:‘超时’”。 “超时”是函数应该完成的状态吗?还是我在代码中遗漏了“到此结束”的内容?
我是一名优秀的程序员,十分优秀!