我在使用C ++在2个或更多线程之间共享列表时遇到问题。我在main()中初始化列表,然后创建线程,将列表对象指针作为参数传递:
pthread_create(&(tid[i]), NULL, &threadfunction, &l);
其中&l
是参数。这是从2个或更多线程中操作相同列表的正确方法吗?我使用一个简单的互斥锁来进行锁定/解锁,因此一次最多只能访问一个线程。
编辑:下面的代码
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include "list.h"
using namespace std;
int count = 0;
pthread_t tid[2];
pthread_mutex_t lock;
void* trythis(void *arg)
{
pthread_mutex_lock(&lock);
printf("Starting thread\n");
count++;
printf("%d\n", count);
if(count == 1)
{
((list *)arg)->Append((char *)"some", (char *)"thing");
printf("Appending done\n");
}
else
{
((list *)arg)->Append((char *)"some", (char *)"else");
printf("Appending done\n");
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void)
{
list* l = new list();
int i = 0;
printf("Starting\n");
if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("mutex init has failed\n");
return 1;
}
while(i < 2)
{
int err = pthread_create(&(tid[i]), NULL, &trythis, &l);
if (err != 0)
printf("\nThread can't be created :[%s]", strerror(err));
i++;
}
pthread_join(tid[0], NULL);
printf("Im out 1\n");
pthread_join(tid[1], NULL);
printf("Im out 2\n");
pthread_mutex_destroy(&lock);
delete l;
return 0;
}
Append()函数只是在列表中添加一些元素(每个列表节点都有2个char *成员)。
答案 0 :(得分:2)
在:
thread_create(&(tid[i]), NULL, &trythis, &l);
它传递类型为l
的局部变量list*
的地址,以便trythis
函数获取list**
并将其错误地转换为list*
。
通过值传递l
:
thread_create(&(tid[i]), NULL, &trythis, l);
答案 1 :(得分:0)
也许可以确保您要传递的数据在线程的生存期内有效?如果在线程使用完该线程之前将其销毁,则将导致不确定的行为。
当您想将相同的pthread_create
与不同的参数重用时,start_routine
的最后一个参数只是一种方便。线程只需引用相同的变量即可共享数据。