来自线程的分段错误

时间:2016-10-03 13:31:54

标签: c pthreads dynamic-memory-allocation

我已经编写了下面的代码但是当我运行它时会带来分段错误。它虽然编译正确。我的错误在哪里?

 at System.Data.Entity.Core.Objects.ObjectContext.get_Connection()
 at System.Data.Entity.Core.Objects.Internal.ObjectQueryState.get_DefaultStreamingBehavior()
 at System.Data.Entity.Core.Objects.Internal.ObjectQueryState.get_EffectiveStreamingBehavior()
 at System.Data.Entity.Core.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
 at System.Data.Entity.Core.Objects.ObjectQuery.ToTraceString()
 at System.Data.Entity.Internal.Linq.InternalSet`1.ToString()
 at System.Data.Entity.Infrastructure.DbQuery`1.ToString()
 at System.IO.TextWriter.Write(Object value)
 at System.IO.TextWriter.SyncTextWriter.Write(Object value)
 at System.Console.Write(Object value)
 at VideoTrainingSystem.Controllers.AdminController.Index() in C:\Users\lg701\Documents\Visual Studio 2015\Projects\VTS2\VTS\Controllers\AdminController.cs:line 18

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using System.Web.Mvc;
 using VTS.Models;

 namespace VTS.Controllers
 {
     public class AdminController : Controller
     {
        // GET: Admin
        public ActionResult Index()
        {
           try
           {
              var test = GetUsers();
           }
           catch (Exception ex)
           {
               Console.Write(ex);
           }

        return View();
    }


    public IQueryable<User> GetUsers()
    {
        IQueryable<User> users;
        using (UserContext userContext = new UserContext())
        {
            users = userContext.Users;
        }

        if (users.Any() == false)
        {
            return null;
        }
        else
        {
            return users;

        }
    }
}

欢迎任何提示。

谢谢

1 个答案:

答案 0 :(得分:2)

你有几个问题:

1)您将NULL传递给pthread_create(),这可能是segfault的原因。

2)你不要等待线程完成(当main线程退出整个进程时)。

3)您将地址相同的变量i传递给所有线程。这是数据竞赛

4)您正从线程函数返回局部变量buf的地址。

您可以修改它:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static int N = 5;
static void* run(void *arg) {
  int *i = (int *) arg;
  char *buf = malloc(16);
  snprintf(buf, 16, "thread %d", *i);
  return buf;
}

int main(int argc, char *argv[]) {
  int i;
  void *ret;
  int arr[N];
  pthread_t pt[N];

  for (i = 0; i < N; i++) {
    arr[i] = i;
    pthread_create(&pt[i], NULL, run, &arr[i]);
  }

  for (i = 0; i < N; i++) {
    pthread_join(pt[i], &ret);
    printf("Thread %d returned: %s\n", i, (char*)ret);
    free(ret);
  }
  return EXIT_SUCCESS;
}

请注意,您不需要使用pthread_join()来电。您还可以从主线程中调用pthread_exit(),以便只有主线程退出并继续其他线程。